SQL Server 如何从每组中选择前3个最高值

utugiqy6  于 2022-12-28  发布在  其他
关注(0)|答案(1)|浏览(126)

我有一个分数表,学生的测验分数和作业分数按以下方式输入
| 学生编号|课程ID|测验1|测验2|测验3|测验4|测验5|任务1|任务2|任务3|任务4|任务5|
| - ------| - ------| - ------| - ------| - ------| - ------| - ------| - ------| - ------| - ------| - ------| - ------|
| 1个|三二一|* * 10个**| * * 八**|四个|1个|* * 九**| * * 七**|三个|* * 九**| * * 八**|五个|
| 第二章|三二一|* * 六**| * * 10个**|六个|三个|* * 八**|四个|* * 七**| 1个|* * 八**| * * 六**|
| 三个|三二一|* * 七**| * * 九**|第二章|* * 八**|四个|* * 10个**| * * 七**|五个|* * 八**|三个|
| 四个|三二一|* * 七**|第二章|* * 六**|四个|* * 八**|三个|* * 六**| * * 九**| * * 10个**|五个|
| 五个|三二一|三个|四个|* * 五**| * * 七**| * * 10个**|五个|* * 七**| * * 八**|三个|* * 九**|
现在我想选出最高的3个测验号码和最高的3个作业号码,并将它们相加,分别作为每个学生的总测验号码和总作业号码。为了更好地理解,我在上表中用粗体显示了最高号码
结果应该是这样的
| 学生编号|课程ID|测验总计|任务共计|
| - ------| - ------| - ------| - ------|
| 1个|三二一|二十七|二十四|
| 第二章|三二一|二十四|二十一|
| 三个|三二一|二十四|二十五|
| 四个|三二一|二十一|二十五|
| 五个|三二一|二十二|二十四|
我试过的是非枢轴技术,但结果不是我所期望的。以下是我所尝试的

SELECT TOP(3) StudentID,  Marks 
FROM
(SELECT StudentID,CourseID , Quiz1, Quiz2, Quiz3, Quiz4, Quiz5  FROM Marks) stu

UNPIVOT

(Marks FOR QuizNo IN (Quiz1, Quiz, Quiz3, Quiz4, Quiz5)) AS mrks 

WHERE    (CourseID = 321)
Order by Marks Desc
igsr9ssn

igsr9ssn1#

一种方法是使用CROSS APPLY取消透视并对标记求和

SELECT StudentID, CourseID, qm.m, am.m
FROM Marks 
cross apply (
  select sum (q) m
  from (
     select top(3) q
     from (
       values
         (Quiz1),(Quiz2),(Quiz3),(Quiz4),(Quiz5)
       ) t(q)
     order by q desc
     ) tq
  ) qm
cross apply (
  select sum (q) m
  from (
     select top(3) q
     from (
       values
         (Assignment1),(Assignment2),(Assignment3),(Assignment4),(Assignment5)
       ) t(q)
     order by q desc
     ) tq
  ) am

相关问题