题目:用学生的总成绩并进行排名
疑问点:我想用row_number写出排名,但是系统报错(Error Code: 1242. Subquery returns more than 1 row)求大神指点。
我写的查询如下:
select
s_id,
row_number()over(order by (select sum(s_score) from score group by s_id )desc) as ranking
from score
--成绩表
CREATE TABLE Score
(s_id
VARCHAR(20),c_id
VARCHAR(20),s_score
INT(3),
PRIMARY KEY(s_id
,c_id
)
);
--成绩表测试数据
insert into Score values('01' , '01' , 80);
insert into Score values('01' , '02' , 90);
insert into Score values('01' , '03' , 99);
insert into Score values('02' , '01' , 70);
insert into Score values('02' , '02' , 60);
insert into Score values('02' , '03' , 80);
insert into Score values('03' , '01' , 80);
insert into Score values('03' , '02' , 80);
insert into Score values('03' , '03' , 80);
insert into Score values('04' , '01' , 50);
insert into Score values('04' , '02' , 30);
insert into Score values('04' , '03' , 20);
insert into Score values('05' , '01' , 76);
insert into Score values('05' , '02' , 87);
insert into Score values('06' , '01' , 31);
insert into Score values('06' , '03' , 34);
insert into Score values('07' , '02' , 89);
insert into Score values('07' , '03' , 98);
开窗函数可以用子查询,但和=子查询一样,不能返回多值,你这个查询可以调整下
declare @score TABLE(
s_id VARCHAR(20),
c_id VARCHAR(20),
s_score INT
)
insert into @score values('01' , '01' , 80);
insert into @score values('01' , '02' , 90);
insert into @score values('01' , '03' , 99);
insert into @score values('02' , '01' , 70);
insert into @score values('02' , '02' , 60);
insert into @score values('02' , '03' , 80);
insert into @score values('03' , '01' , 80);
insert into @score values('03' , '02' , 80);
insert into @score values('03' , '03' , 80);
insert into @score values('04' , '01' , 50);
insert into @score values('04' , '02' , 30);
insert into @score values('04' , '03' , 20);
insert into @score values('05' , '01' , 76);
insert into @score values('05' , '02' , 87);
insert into @score values('06' , '01' , 31);
insert into @score values('06' , '03' , 34);
insert into @score values('07' , '02' , 89);
insert into @score values('07' , '03' , 98);
select
a.s_id
,dense_rank() over(order by total desc) as ranking
from @score a
left join (
select s_id,sum(s_score) as total from @score group by s_id
) b on a.s_id=b.s_id
因为你是想根据sum的值排序,所以推测,你应该是想使用 dense_rank这个方式,如果不是,可以自行改回 row_number
如果一定要用你这个,可以修改成这样,加个条件,让他返回单一值即可
select
s_id,
row_number()over(order by (select sum(s_score) from score where s_id=a.s_id group by s_id )desc) as ranking
from score a