Student(S#, Sname)
Course(C#, Cname)
SC(S#, C#, Score)
S# Sname 語文 數學 英語
01 趙雷 80 90 99
02 錢電 70 60 80
SELECT a.S# 學生編號, a.Sname 學生姓名,
MAX(CASE c.Cname WHEN N'語文' THEN b.Score END) [語文],
MAX(CASE c.Cname WHEN N'數學' THEN b.Score END) [數學],
MAX(CASE c.Cname WHEN N'英語' THEN b.Score END) [英語]
FROM Student a
LEFT JOIN SC b ON a.S# = b.S#
LEFT JOIN Course c ON b.C# = c.C#
GROUP BY a.S#, a.Sname
ORDER BY a.S#;
S# Sname Cname Score01 趙雷 語文 8001 趙雷 數學 9001 趙雷 英語 9902 錢電 語文 70...NULL。CASE WHEN '語文' THEN 80 END → 80,同行 數學/英語 → NULL。語文 欄只有唯一一行有值 (80),其餘 NULL,MAX(80, NULL, NULL) = 80。同理數學、英語。MAX (或 SUM/MIN) 將「稀疏矩陣」壓縮為單行。CASE WHEN ... THEN score END 隱含 ELSE NULL,NULL 不參與聚合計算。MAX 取最高分,SUM 會加總,需依業務選擇聚合函數。科目不固定時,需動態構建 SQL (預存程序/應用層拼接) 或使用資料庫特有透視語法:
- SQL Server: PIVOT
- Oracle: PIVOT / LISTAGG
- PostgreSQL: crosstab (tablefunc)
- MySQL: 僅支援動態 SQL 拼接