sql sever 2008r2查询各系各科成绩最高分的学生的学号,姓名,系名,课程名称,成绩

学生表student,成绩表sc,课程表course
学生表中sno,sname,ssexn,sname,sdept
成绩表中sno,cno,grade
课程表中cno,cname,cpno,ccredit

请参考下列SQL语句:

select student.sno,student.sname,student.sdept,
course.cname,t.maxgrade from 
student,course,
(select  s.sno,c.sdept,s.cno,c.maxgrade 
from sc s,student st,
(select a.sdept,b.cno,max(b.grade) as maxgrade 
from student a,sc b where a.sno=b.sno 
group by a.sdept,b.cno) c 
where s.sno=st.sno and st.sdept=c.sdept and 
s.grade=c.maxgrade) t where student.sno=t.sno 
and course.cno=t.cno order by course.cname,student.sdept;

上述语句已经测试通过。代码思路是:

学生表与成绩表基于学号进行连接获取每个学号所在系名,然后用院系和课程号对成绩表分组汇总,求得每个院系、每个课程的最高得分(结果集c,含系名、课程号和最高分)。然后用结果集C再次与成绩表、学生表进行比对,筛选出获得每个系、每个课程的最高分的学号并包含课程号和系名(结果集t)。最后t通过连接获取学生表中的学生姓名、课程表中的课程名完成最后输出。

追问

抱歉答案不对啊.重复了啊

追答

如果成绩表同一个系同一个课程有多人拿到最高分那自然都会被检出的。同一个人他可能在同一个系中,在不同的课程都拿到最高分,当然这个最高分不一定是该课程的最高分,但他是该系学生中该课程的最高分。不知您要求是怎样的效果,将检索结果贴出来,然后注明怎样重复,我再调整语句

追问

,一个人同一门重复了多次而且有人不是这门课最高分也被查询出来,应该是没有满足各系各科最高分的要求。

追答

我是按同一个课程在不同的系中都有它各自的最高分获得者这样去编写语句的。当然如果存在成绩表同一个学生同一个课程有多条记录的话,我的语句是不会排除重复的,因为我认为成绩表应该有约束限制这种情况发生,所以语句中不予考虑该情形。如果是这样使用distinct就可以排除重复。

追问

我用distinct排除重复了发现还有一些人不是这个系这个课最高分然而他也被查询出来了

追答

这是我测试的情况

代码运行结果

以上是我测试的情况,代码是通用SQL代码,在MSSQL上运行结果是一样的。有问题我们继续讨论。如果能贴出您的运行效果讨论会更有效

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-04-15
select
    a.sno 学号,a.sname 姓名,a.sdept 系名,c.cname 课程名称,b.maxgrade 成绩
from
    student a
    inner join (select cno,max(sno) sno,max(grade) maxgrade from sc group by cno) b on a.sno=b.sno
    inner join course c on b.con=c.cno

追问

这样只能查出一个系的

追答select
    a.sno 学号,a.sname 姓名,a.sdept 系名,c.cname 课程名称,b.maxgrade 成绩
from
    student a
    inner join course b on a.son=b.sno
    inner join sc c on a.sno=c.sno and b.cno=c.cno
    inner join (select cno,max(grade) maxgrade from sc group by cno) d on c.cno=d.cno and c.grade=d.maxgrade

本回答被网友采纳
第2个回答  2018-04-15
好的,这个涉及到分组排序子查询等追问

我也知道。。。能告诉代码吗?

我也知道。。。能告诉代码吗?

sql sever 2008r2查询各系各科成绩最高分的学生的学号,姓名,系名...
student.sdept;上述语句已经测试通过。代码思路是:学生表与成绩表基于学号进行连接获取每个学号所在系名,然后用院系和课程号对成绩表分组汇总,求得每个院系、每个课程的最高得分(结果集c,含系名、课程号和最高分)。然后用结果集C再次与成绩表、学生表进行比对,筛选出获得每个系、每个课程的最高分...

sql sever 2008R2中查询选课表和学生表中每位学生的学号,姓名,平均成绩...
create table 学生表(学号 varchar(8),姓名 varchar(10))insert into 学生表 values ('01010101','王一')insert into 学生表 values ('01010102','王二')insert into 学生表 values ('01010103','王三')create table 选课内容表(学号 varchar(8),课程号 varchar(2),成绩 int)insert into 选课...

sql sever问题:查询每个系有多少个同学...
count(学号)as 学生人数 from 系 select 平均成绩 from (select avg(成绩)平均成绩 from 成绩表 group by 课程 )as a order by 平均成绩 desc select 学号,count(成绩)from(select from 成绩表 where 成绩>90)as a group by 学号 having conut(成绩)>2 select count(学号),avg(成绩),max(成...

SQL Sever查询
查询成绩最高的前三名学生学生学号,姓名 select top 3 a.学号,a.姓名 from 学生 a,课程表 b where a.学号=b.学号 order by b.成绩 查询女生的成绩 select b.成绩,a.学号,a.姓名 from 学生 a,课程表 b where a.学号=b.学号 and a.性别='女'...

sql sever问题:查询每个系有多少个同学...
select count(学号) as 学生人数 from 系 select 平均成绩 from (select avg(成绩) 平均成绩 from 成绩表 group by 课程 ) as a order by 平均成绩 desc select 学号,count(成绩) from(select * from 成绩表 where 成绩>90) as a group by 学号 having conut(成绩)>2 select count(学号)...

几个SQLsever的问题,两种查询语句有点不知道怎么搞,只会一种子查询
create table #CJB(学号 char(6),课程号 char(3),成绩 int)create table #KCB(课程号 char(3),课程名 char(16),开课学期 tinyint,学时 tinyint,学分 tinyint)create table #XSB(学号 char(6),姓名 char(8),性别 bit,出生时间 datetime,专业 char(200),总学分 int,备注 varchar(500))...

如何用SQL建立一个学生成绩管理系统数据库?
课程表、修课表,表的结构分别如下:学生表(student) (学号(sno) 普通编码定长字符类型,长度7,主码,姓名(sname) 普通编码定长字符类型,长度8,非空,性别(ssex) 统一编码定长字符类型,长度1,年龄(sage) 微整型,所在系(sdept) 统一编码可变长字符类型,长度20)课程表(course) (课程号(cno)...

用SELECT语句统计并显示每个系的系号、系名以及每个系学生的人数
select 系号,系名,count(学生) 学生人数 from 表 group by 系号,系名 其实我这样回答很愚蠢.因为我根本不知你的表结构.就像你不提供表结构就问问题一样愚蠢!

用sql检索选修刘老师所授全部课程的学生学号。
---查询出选择这些课程的学生学号 SELECT SC.SNO FROM SCELECT SC INNER JOIN ---E查询出刘老师所授课程的课程号 (SELECT C.CNO FROM COURSE C INNER JOIN TEACHER T ON C.TNO=T.TNO WHERE T.TNAME='刘老师') E ON SC.CNO=E.CNO ...

sql sever
l use 教学成绩管理数据库select 教学成绩表.学号,姓名,sum(分数) 总分,avg(分数) 均分from 学生信息表 join 教学成绩表 on 学生信息表.学号 = 教学成绩表.学号group by 教学成绩表.学号,姓名 order by avg(分数) desc 查询 ‘教学成绩管理数据库’ 中 ‘学生信息表’ 与 ‘教学成绩表’...

相似回答