日期:2014-05-17  浏览次数:20871 次

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怎么写,谢谢啦!


------解决方案--------------------
insert into testa values('E', 1, null, null);
你的表有3个字段,可以插入 4个 值,这也行?
另外 表述不清楚
------解决方案--------------------
 select 
 nvl2(score1,row_number() over(order by  score1 desc nulls last )
------解决方案--------------------
'/'
------解决方案--------------------
count(score1)over(),'-'),
 nvl2(score2,row_number() over( order by score2 desc nulls last )
------解决方案--------------------
'/'
------解决方案--------------------
count(score2)over(),'-'),
 nvl2(score3,row_number() over( order by score3 desc nulls last )
------解决方案--------------------
'/'
------解决方案--------------------
count(score3)over(),'-'),
 name
 from testa

------解决方案--------------------
引用:
SQL code123456 select  nvl2(score1,row_number() over(order by  score1 desc nulls last )
------解决方案--------------------
'/'
------解决方案--------------------
count(score1)over(),'-'), nvl2(score2,row_number() over( order by score2 desc nulls last )
------解决方案--------------------
'……