在SQL SERVER中,怎样查询每门功课成绩最好的前两名,帮我写一下,谢谢,请补充:
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在SQL SERVER中,怎样查询每门功课成绩最好的前两名,帮我写一下,谢谢,请补充:相关的知识,希望对你有一定的参考价值。
create table SC(
S# varchar(10), /*学号
C# varchar(10), /*课号
score decimal(18,1) /*成绩
)
insert into sc values('01' , '01' , 80)
insert into sc values('01' , '02' , 90)
insert into sc values('01' , '03' , 99)
insert into sc values('02' , '01' , 70)
insert into sc values('02' , '02' , 60)
insert into sc values('02' , '03' , 80)
insert into sc values('03' , '01' , 80)
insert into sc values('03' , '02' , 80)
insert into sc values('03' , '03' , 80)
insert into sc values('04' , '01' , 50)
insert into sc values('04' , '02' , 30)
insert into sc values('04' , '03' , 20)
insert into sc values('05' , '01' , 76)
insert into sc values('05' , '02' , 87)
insert into sc values('06' , '01' , 31)
insert into sc values('06' , '03' , 34)
insert into sc values('07' , '02' , 89)
insert into sc values('07' , '03' , 98)
go
查询每门功课成绩最好的前两名,求高手指教。
最后的执行结果是:
01 01 80.0
03 01 80.0
01 02 90.0
07 02 89.0
01 03 99.0
07 03 98.0
select sc1.s#,sc1.c#,sc1.score from sc sc1 where score in
(select top 2 sc2.score from sc sc2
where sc2.C# = sc1.C# order by sc2.score desc)
order by sc1.C# , sc1.score desc
这样的语句也能实现同样的功能,但我有点看不太懂,能各位高手能帮我分析一下吗,呵呵。谢谢。where sc2.C# = sc1.C#这里又用到了SC1,感觉有点头晕。
S# varchar(10), --学号
C# varchar(10), --课号
score decimal(18,1) --成绩
)
insert into #sc values('01' , '01' , 80)
insert into #sc values('01' , '02' , 90)
insert into #sc values('01' , '03' , 99)
insert into #sc values('02' , '01' , 70)
insert into #sc values('02' , '02' , 60)
insert into #sc values('02' , '03' , 80)
insert into #sc values('03' , '01' , 80)
insert into #sc values('03' , '02' , 80)
insert into #sc values('03' , '03' , 80)
insert into #sc values('04' , '01' , 50)
insert into #sc values('04' , '02' , 30)
insert into #sc values('04' , '03' , 20)
insert into #sc values('05' , '01' , 76)
insert into #sc values('05' , '02' , 87)
insert into #sc values('06' , '01' , 31)
insert into #sc values('06' , '03' , 34)
insert into #sc values('07' , '02' , 89)
insert into #sc values('07' , '03' , 98)
create table #temp
(
S# varchar(10), --学号
C# varchar(10), --课号
score decimal(18,1) --成绩
)
insert into #temp
select top 2 *from #SC where C#='01' order by score desc
insert into #temp
select top 2 *from #SC where C#='02' order by score desc
insert into #temp
select top 2 *from #SC where C#='03' order by score desc
select *from #temp
drop table #temp
drop table #SC
运行结果
S# C# score
01 01 80.0
03 01 80.0
01 02 90.0
07 02 89.0
01 03 99.0
07 03 98.0 参考技术A select * from
(
select top 2 * from SC where C#='01' order by score desc
) a
union
select * from
(
select top 2 * from SC where C#='02' order by score desc
) b
union
select * from
(
select top 2 * from SC where C#='03' order by score desc
) c
order by C#,S#,score本回答被提问者采纳 参考技术B SELECT
*
FROM
SC
WHERE
( SELECT
COUNT(1)
FROM
SC SC1
WHERE
SC.C# = SC1.C#
AND SC.score < SC1.score
) < 2
ORDER BY
C#,S#追问
1, SC.score < SC1.score
这条语句是什么意思啦?
2,()<2为什么,括号内为什么要小于2呢?
select * from sc a
where s# in (
select s# from (select top 2 b.score,s# from sc b
where b.c#=a.c#
group by score,s#
order by score desc) c
)
order by c#,score desc 参考技术D 单独科目去查吧,一起查我也不会,单独查某门科目前两名用top就可以追问
这样查我也会,还是多学学吧。
sql: 练习题 25查询每门课程的平均成绩,结果按平均成绩降序排列
题目:查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
刚开始写的sql 比较简单:
SELECT courseid, AVG(score) as a FROM student_score GROUP BY courseid ORDER BY a DESC, courseid ASC;
但是我看到答案 可以列出 coursename:
但是coursename又是在student_course 表里面,要去关联这个表,但是对于GROUP BY聚合操作,如果在SELECT中的列中 要列出 coursename ,但是 coursename 没有在GROUP BY中出现,这样的sql
是不合法的,会报错 因为列不在GROUP BY从句中,也就是说查出来的列必须在group by后面出现,否则就会报错,或者这个字段出现在聚合函数里面。
但是我还是改了系统配置,执行了这个sql 不知道在工作中这样是不是合法的?
SELECT courseid,student_course.coursename,
AVG(score) as a FROM student_score,student_course WHERE student_score.courseid = student_course.id
GROUP BY courseid ORDER BY a DESC, courseid ASC;
以上是关于在SQL SERVER中,怎样查询每门功课成绩最好的前两名,帮我写一下,谢谢,请补充:的主要内容,如果未能解决你的问题,请参考以下文章
sql 练习题 36,37查询每门功成绩最好的前两名,统计每门课程的学生选修人数(超过 5 人的课程才统计)