程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> sql-SQL case語句如何執行的

sql-SQL case語句如何執行的

編輯:編程綜合問答
SQL case語句如何執行的

有張學生表
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#
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved