oracle 如何对多个字段同时排名时,并加上本字段非空的个数
本帖最后由 luzhiyonghello 于 2012-11-05 19:38:02 编辑
有一张表:create table TestA(
name varchar2(10),
score1 int,
score2 int,
score3 int
);
插入数据如下 :
insert into testa values('A', 8, 1, 6);
insert into testa values('B', 7, 9, 2);
insert into testa values('C', 5, 3, null);
insert into testa values('D', 3, null, null);
insert into testa values('E', 1, null, null);
现求一条SQL对这张表中的score1,score2,score3同时排名,并加上总共有多少人参加排名,如score1每个人都有分数,则A的排名为1/5,B为2/5,C为3/5,D为4/5,E为5/5【score1每人都有分数,即非空的行数为5】,同样score2只有3人都有分数,则A的排名为3/3,B为1/3,C为2/3, D,E没有数据则为空 【score2只有A,B,C三人有分数,即非空的行数为3】,score3只有2人有分数,则A的排名为1/2,B为2/2,C,D,E没有分数,则为空【score3只有A,B二人有分数,即非空的行数为2】;以此类推,最后的查询结果如下:
name score1 score2 score3
A 1/5 3/3 1/2
B 2/5 1/3 2/2
C 3/5 2/3 -
D 4/5 - -
E 5/5 - -
请高手看看这条sql怎么写,谢谢啦!
------最佳解决方案-------------------- select
nvl2(score1,row_number() over(order by score1 desc nulls last )
------其他解决方案--------------------
insert into testa values('E', 1, null, null);
你的表有3个字段,可以插入 4个 值,这也行?
另外 表述不清楚
------其他解决方案--------------------
'/'
------其他解决方案--------------------
看错了,你表述不清楚
------其他解决方案--------------------
count(score1)over(),'-'),
nvl2(score2,row_number() over( order by score2 desc nulls last )