求教一句sql查询
一个Student表 包含StuId,Score,CourseId
我想查全班前2名学生每门课程的学号,分数,以及课程编号并按分数降序排序
我写的是:
select top 2 Max(StuId),Sum(Score),CourseId from Student group by CourseId order by Score desc
我知道有group by 的语句 前面select的字段 要么是group by 后的字段 要么就得给字段加聚合函数 Max(StuId),Sum(Score) 这里用对了吗,我感觉怪怪的。请高手指点我
SELECT a.StuId, a.Score, a.CourseId
FROM Student AS a INNER JOIN (SELECT top 2 StuID, Sum(Score) AS AllScore FROM Student GROUP BY StuID order by sum(Score) desc ) AS b ON a.StuId=b.StuID
ORDER BY b.AllScore DESC 采用多表联立查询,先select出总分最高的并且排序,取前2的StuID,再JOIN到原来的表格,取对应的单独的分数
但是你的每门课程没有体现出来啊
@醉心: 并按分数降序排序不是按总分排的?还是,不同课程的分数也要排序?
@利维尔: 排序的问题你是对的,但是你没有按课程分组啊,按道理数学应该只在同一StuId编号下出现一次啊
@醉心: 那个表设计的时候写错了,复制的时候忘记改了,结果还是一样的
@利维尔: 一张表貌似没必要再join吧 求最简洁的sql啊 你看我写的那句怎么样
@醉心: 我觉得如果要对一个表的字段进行合计函数,并且分组,又想拿到分组之前的字段。单靠一步很难做的。要么用JOIN 要么子查询
@醉心: 我也不懂mix 函数是干嘛用的,从来没见过这个函数,执行也报错
@利维尔: 好吧 我打错字了 是max 你帮我执行下我写的语句看看效果是啥样啊
@醉心: select top 2 Max(StuId),Sum(Score),CourseId from Student group by CourseId order by Sum(Score) desc 这个的结果是
@利维尔: 确实是我的错了 感谢指点。但是你那个分数排序有点问题吧 不全是按降序的啊
@醉心: 我这个是按总分降序排的,没有按每门分数,如果想按每门分数就这样 ORDER BY a.Score DESC 就最后一句,b.AllScore 是代表总分,a.Score 就代表分数
没错。
order by Score 改成 order by sum(Score)
加和不加效果应该一样吧
@醉心: 哥们,你描述有问题还是我看不明白,你是不是想要每门课程前2名的学生信息??
@英雄莫问出处: 对啊
@醉心:
select t1.* from Student t1,
(select top 2 Min(StuId) as stuid1,Max(StuId) as stuid2,CourseId from Student group by CourseId order by Score desc) t2 where t1.CourseId=t2.CourseId and (t1.StuId=t2.stuid1 or t1.StuId=t2.stuid2)
@英雄莫问出处: 貌似有点复杂了 我写的那句不用表链接的写法 也是可行的吧
@醉心: 糊涂啊,把mix改掉min
你认真比对一下,肯定是不一样的,执行看看