2016-11-14 70 views
0

我有一些查询MySQL数据库的经验,我正在学习如何在Oracle中做同样的事情。我有多难理解这个问题。假设我有一个DEMOGRAPHICS表,其中包含以下列:DATE_OF_BIRTH,GENDER,RACE,ETHNICITY。还有一张CAR列表,其中列出了不同品牌的汽车(丰田,福特等)。我将如何创建一份统计报告,列出男性,女性,白人,亚洲人,黑人,西班牙人,非西班牙人以及两个年龄段(18-30岁和50-70岁)列中的每辆汽车制造商和相应的百分比率。百分比应四舍五入至小数点后两位。它应该是这样的: enter image description here 我会很感激任何帮助,包括对类似查询的引用。 谢谢!用于统计报告的PL/SQL查询?

回答

0

需要更多信息。 WHITE,亚洲人,黑人< ==在这些掉落下RACE列 拉美裔,而不是西班牙< ==这些都在下降柱族群社区调查

+0

谢谢你的回复! WHITE,ASIAN,BLACK在RACE,HISPANIC,NOT HISPANIC下属于种族。你为什么一开始就放弃两张桌子?假设我在这两个表中都有成千上万的列表,将它们中的每一个逐一插入到一个新表格中都不是很有效。 – icittar

+0

放下不是必需的,但由于我已经在我的模式中有一个名为人口统计的表,我放弃了它 –

0
drop table demographics 

drop table car 

create table car(MAKE_ID number primary key, MAKE varchar2(30)); 

create table demographics(DATE_OF_BIRTH date , GENDER varchar2(10), RACE varchar2(30), ETHNICITY varchar2(30), MAKE_ID references car); 

--insert into car table 
insert into car values(1,'Toyota'); 
insert into car values(2,'Ford'); 
insert into car values(3,'GM'); 

--inserts 1000 rows into the demographics table 
insert into demographics 
select trunc(sysdate) - level as dob 
     ,case when mod(level,2)=0 then 'MALE' else 'FEMALE' end as gender 
     ,case when mod(level,2)=0 then 'WHITE' else 'BLACK' end as race 
     ,case when mod(level,4)=0 then 'ASIAN' 
       when mod(level,3)=0 then 'HISPANIC' 
       when mod(level,2)=0 then 'NOT HISPANIC' 
       else 'LATINO' 
     end as ethnicity 
     ,case when mod(level,3)=0 then 3 
       when mod(level,2)=0 then 2 
       when mod(level,1)=0 then 1 
     end as make_id  
from dual 
connect by level<=1000; 


select make 
     ,round((cnt_MAKE/tot_cnt)*100,2) as MALE_PERCENT 
    ,round((cnt_MAKE/tot_cnt)*100,2) as FEMALE_PERCENT 
from(  
select a.make 
     ,count(case when b.gender ='MALE' then 1 end) as cnt_MALE 
     ,count(case when b.gender ='FEMALE' then 1 end) as cnt_FEMALE 
     ,count(case when b.race ='WHITE' then 1 end) as cnt_WHITE 
     ,count(case when b.ethnicity ='ASIAN' then 1 end) as cnt_ASIAN 
     ,count(case when b.race ='BLACK' then 1 end) as cnt_BLACK 
     ,count(case when b.ethnicity ='HISPANIC' then 1 end) as cnt_HISPANIC 
     ,count(case when b.ethnicity ='NOT HISPANIC' then 1 end) as cnt_NOT_HISPANIC 
     ,count(*) as tot_cnt   
    from car a 
    join demographics b 
    on a.make_id=b.make_id 
group by a.make 
)