如何计算sql中的百分比哪个结果会出现在不同的列中?

时间:2015-06-26 05:08:13

标签: sql sas

我必须根据不同的排名等级计算百分比,即第1或第2。下面是一个示例数据表。

Year   Grading_PerID  Candidate_ID   Ranking
-----  ------------   ------------   -------
2007        1              1            1  
2007        1              1            2
2007        2              2            1
2007        3              2            1
2008        4              1            2
2008        3              2            1
2008        2              2            2 
2008        1              1            2
2009        2              1            1   
2009        3              1            2
2009        4              2            1
2009        1              2            1  

我想计算从2007年到2009年,每年对candidate_1和candidate_2进行评分的次数,比例分别是candidate_1和candidate_2被评为第1和第2。期望的输出样本如下:

期待看跌:

Candidate_ID   Year   Count    1_rank   2_rank
------------   ----   -----    ------   ------
     1         2007     2         %        %
     1         2008     2         %        %
     1         2009     2         %        %
     2         2007     2         %        %
     2         2008     2         %        %
     2         2009     2         %        %

我使用下面的sql完成了没有等级百分比的部分:

select candidate_id , year, count(*) as count                    
from myTable                                   
group by candidate_id, year;

但我不知道如何计算每年的排名百分比。我怎么能做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以使用SUM(CASE WHEN ...)有条件地计算每组的1和2级别数:

select candidate_id, year, count(*) as count,
    100*SUM(case when Ranking = 1 then 1 else 0 end) AS 1_rank,
    100*SUM(case when Ranking = 2 then 1 else 0 end) AS 2_rank,
from myTable                                   
group by candidate_id, year;

答案 1 :(得分:0)

根据我的理解排名百分比是一年中候选人被分配等级1或2的多少时间。在2008年,候选人1被分配到两次排名2。在他的情况下,排名2百分比将是100%,排名1百分比将是0。 以下是我的询问,如果您有任何疑问,请告诉我

create table mytable(yr number,grade_id number,c_id number,rank number);

select a.c_id,a.yr,cnt1,NVL((b.cnt2/a.cnt1) * 100,0) rnk_1_percentage,NVL((c.cnt2/a.cnt1) * 100,0) rnk_2_percentage
from 
(select yr,c_id,count(*) cnt1 from mytable group by yr,c_id ) a,
(select yr,c_id,rank,count(*) cnt2 from mytable where rank=1 group by yr,c_id,rank ) b,
(select yr,c_id,rank,count(*) cnt2 from mytable where rank=2 group by yr,c_id,rank) c
where a.yr=b.yr(+)
and a.c_id=b.c_id(+)
and a.yr=c.yr(+)
and a.c_id=c.c_id(+)
order by a.yr;

OR

在oracle中,它就像是支持@Tim Biegeleisen

select yr,c_id
,100*(SUM(decode(rank,1,1,0)) / count(*))  rank1
,100*(SUM(decode(rank,2,1,0)) / count(*)) rank2
 from mytable group by yr,c_id