oracle 如何对多个字段同时排名时,并加上本字段非空的个数

luzhiyonghello 2012-11-05 07:23:27
有一张表: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怎么写,谢谢啦!

...全文
312 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
luzhiyonghello 2012-11-06
  • 打赏
  • 举报
回复
谢谢jdsnhan
yinan9 2012-11-06
  • 打赏
  • 举报
回复
引用 3 楼 jdsnhan 的回复:
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 )||'……
jdsnhan 2012-11-06
  • 打赏
  • 举报
回复
 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
软件钢琴师 2012-11-06
  • 打赏
  • 举报
回复
看错了,你表述不清楚
软件钢琴师 2012-11-06
  • 打赏
  • 举报
回复
insert into testa values('E', 1, null, null); 你的表有3个字段,可以插入 4个 值,这也行? 另外 表述不清楚

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧