有張學生表
S# SName
1 小美
2 小坡
3 李明
…
有張課程
C# Cname
01 語文
02 數學
03 英語
有張成績表
S# C# Score
1 01 98
1 02 85
1 03 56
2 01 100
2 02 56
2 03 65
3 01 60
3 02 56
3 03 45
用SQL語句寫出所有學生的所有課程的成績,
SQL語句如下:
select a.S# 學生編號, a.Sname 學生姓名,
max(case c.Cname when N'語文' then b.score else null end) [語文],
max(case c.Cname when N'數學' then b.score else null end) [數學],
max(case c.Cname when N'英語' then b.score else null 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#
得出的結果示例如下:
學生編號 學生姓名 語文 數學 英語
01 趙雷 80 90 99
02 錢電 70 60 80
03 孫風 80 80 80
我不明白的為什麼上面的SQL語句能得到正確結果。
首先上面的SQL語句連接後,有個類似於這樣的表
學生編號 學生姓名 課程 分數
01 小美 語文 20
01 小美 數學 30
01 小美 英語 40
02 小麗 語文 25
02 小麗 數學 35
02 小麗 英語 99
然後一條一條地執行表中的數據,第一條數據,確實是語文,可以得到語文分數
然後再執行第二個Case ,應該顯示結果為null啊…好亂
我想知道 case語句是如何執行 得到正確結果的
你這問題是因為max原因,你把語句拆一下就理解過程了
1、去掉group by和max,得到的就是你理解的過程
select a.S# 學生編號, a.Sname 學生姓名,
case c.Cname when N'語文' then b.score else null end [語文],
case c.Cname when N'數學' then b.score else null end [數學],
case c.Cname when N'英語' then b.score else null end [英語]
from Student a
left join SC b on a.S# = b.S#
left join Course c on b.C# = c.C#
order by a.S#
2、再第一步基礎上進行人員分組和MAX取每列最大值,得到每門課的最大值。就是case when中沒列唯一有值的。
select a.S# 學生編號, a.Sname 學生姓名,
max(case c.Cname when N'語文' then b.score else null end) [語文],
max(case c.Cname when N'數學' then b.score else null end) [數學],
max(case c.Cname when N'英語' then b.score else null 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#