[英]How to Select Top 3 Highest Values From Each GROUP
我有一個分數表,學生的測驗分數和作業分數按以下方式輸入
學生卡 | 課程編號 | 測驗1 | 測驗2 | 測驗3 | 測驗4 | 測驗5 | 作業一 | 作業二 | 作業3 | 作業4 | 作業5 |
---|---|---|---|---|---|---|---|---|---|---|---|
1個 | 321 | 10 | 8個 | 4個 | 1個 | 9 | 7 | 3個 | 9 | 8個 | 5個 |
2個 | 321 | 6個 | 10 | 6個 | 3個 | 8個 | 4個 | 7 | 1個 | 8個 | 6個 |
3個 | 321 | 7 | 9 | 2個 | 8個 | 4個 | 10 | 7 | 5個 | 8個 | 3個 |
4個 | 321 | 7 | 2個 | 6個 | 4個 | 8個 | 3個 | 6個 | 9 | 10 | 5個 |
5個 | 321 | 3個 | 4個 | 5個 | 7 | 10 | 5個 | 7 | 8個 | 3個 | 9 |
現在我想要 select 最高的 3 個測驗數和最高的 3 個作業數,並將它們分別作為每個學生的總測驗數和總作業數。 為了更好地理解,我在上表中使用了粗體最高數字
結果應該是這樣的
學生卡 | 課程編號 | 測驗總數 | 作業總數 |
---|---|---|---|
1個 | 321 | 27 | 24 |
2個 | 321 | 24 | 21 |
3個 | 321 | 24 | 25 |
4個 | 321 | 21 | 25 |
5個 | 321 | 22 | 24 |
我嘗試過的是 unpivot 技術,但結果不是我所期望的。 這是我試過的
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
一種方法是使用 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.