23按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺
--Score重复时保留名次空缺 ---尽量用此方法,应为row_num() rank dense_ranksqlserver高级用法,其他sql数据库不通用
select t.* , px = (select count(1) from SC where Cid = t.Cid and score > t.score) + 1 from sc t order by t.cid , px
25查询学生的总成绩,并进行排名,总分重复时保留名次空缺
SELECT b.* ,
( SELECT COUNT(1)
FROM ( SELECT t.SId ,
SUM(t.score) 总成绩
FROM SC t
GROUP BY t.SId
) a
WHERE a.总成绩 > b.总成绩 ---注意此处学生总成绩排序与 上面每门课程排序不同之处是 每门课程是有3门,而学生id 只有1类,所以才有 where a.cid =b.cid and a.score >b.score 与下面 直接where a.score>b.score 区别,重点在分组排序和排序
) + 1 AS px
FROM ( SELECT t.SId ,
SUM(t.score) 总成绩
FROM SC t
GROUP BY t.SId
) b
ORDER BY px
其中要点:
1.关联子查询 排序 ,为什么不用 row_num()over() ,rank() ,dense rank() ,因为这些高级函数sqlserver 独有,其他mysql 不一定支持
2.分组子查询 和 嵌套子查询