我必须根据不同的排名等级计算百分比,即第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;
但我不知道如何计算每年的排名百分比。我怎么能做到这一点?
答案 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