首页新闻找找看学习计划

求教一句sql查询 懂的人非常简单

0
悬赏园豆:20 [已解决问题] 解决于 2015-02-04 13:33

求教一句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) 这里用对了吗,我感觉怪怪的。请高手指点我

醉心的主页 醉心 | 初学一级 | 园豆:99
提问于:2015-02-04 11:00
< >
分享
最佳答案
0

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到原来的表格,取对应的单独的分数

收获园豆:10
深空灰 | 菜鸟二级 |园豆:212 | 2015-02-04 11:32

但是你的每门课程没有体现出来啊

醉心 | 园豆:99 (初学一级) | 2015-02-04 11:34

@醉心: 并按分数降序排序不是按总分排的?还是,不同课程的分数也要排序?

深空灰 | 园豆:212 (菜鸟二级) | 2015-02-04 11:39

@利维尔: 排序的问题你是对的,但是你没有按课程分组啊,按道理数学应该只在同一StuId编号下出现一次啊

醉心 | 园豆:99 (初学一级) | 2015-02-04 11:47

@醉心: 那个表设计的时候写错了,复制的时候忘记改了,结果还是一样的

深空灰 | 园豆:212 (菜鸟二级) | 2015-02-04 11:50

@利维尔: 一张表貌似没必要再join吧  求最简洁的sql啊 你看我写的那句怎么样

醉心 | 园豆:99 (初学一级) | 2015-02-04 12:23

@醉心: 我觉得如果要对一个表的字段进行合计函数,并且分组,又想拿到分组之前的字段。单靠一步很难做的。要么用JOIN 要么子查询

深空灰 | 园豆:212 (菜鸟二级) | 2015-02-04 12:33

@醉心: 我也不懂mix 函数是干嘛用的,从来没见过这个函数,执行也报错

深空灰 | 园豆:212 (菜鸟二级) | 2015-02-04 12:50

@利维尔: 好吧 我打错字了 是max   你帮我执行下我写的语句看看效果是啥样啊

醉心 | 园豆:99 (初学一级) | 2015-02-04 12:56

@醉心: select top 2 Max(StuId),Sum(Score),CourseId from Student group by CourseId  order by Sum(Score) desc 这个的结果是

深空灰 | 园豆:212 (菜鸟二级) | 2015-02-04 13:05

@利维尔: 确实是我的错了 感谢指点。但是你那个分数排序有点问题吧 不全是按降序的啊

醉心 | 园豆:99 (初学一级) | 2015-02-04 13:24

@醉心: 我这个是按总分降序排的,没有按每门分数,如果想按每门分数就这样 ORDER BY a.Score DESC         就最后一句,b.AllScore 是代表总分,a.Score 就代表分数

深空灰 | 园豆:212 (菜鸟二级) | 2015-02-04 13:32
其他回答(2)
0

没错。

Firen | 园豆:5483 (大侠五级) | 2015-02-04 11:22
0

 order by Score 改成  order by sum(Score) 

收获园豆:10
?,???? | 园豆:1060 (小虾三级) | 2015-02-04 11:26

加和不加效果应该一样吧

支持(0) 反对(0) 醉心 | 园豆:99 (初学一级) | 2015-02-04 11:31

@醉心: 哥们,你描述有问题还是我看不明白,你是不是想要每门课程前2名的学生信息??

支持(0) 反对(0) ?,???? | 园豆:1060 (小虾三级) | 2015-02-04 11:49

@英雄莫问出处: 对啊

支持(0) 反对(0) 醉心 | 园豆:99 (初学一级) | 2015-02-04 11:52

@醉心: 

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)

支持(0) 反对(0) ?,???? | 园豆:1060 (小虾三级) | 2015-02-04 12:02

@英雄莫问出处:  貌似有点复杂了 我写的那句不用表链接的写法 也是可行的吧

支持(0) 反对(0) 醉心 | 园豆:99 (初学一级) | 2015-02-04 12:20

@醉心: 糊涂啊,把mix改掉min 

你认真比对一下,肯定是不一样的,执行看看

支持(0) 反对(0) ?,???? | 园豆:1060 (小虾三级) | 2015-02-04 12:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册