[SQL][Quiz]找出欄位中最大值

內部訓練題目

最近在幫部門內的同仁快快樂樂學 T-SQL,想到一個好玩的題目給大家,假設有一個資料表 Students,裡面記錄學生的三次考試成績,需要找到三次中最高的成績,請問要如何下 SQL 呢 ?

這個是產生測試範例

SELECT * INTO #Students
FROM ( VALUES ( 'John' , 100, 90 , 80 ),( 'Tom' , 80, 90 , 100 ),( 'Eric' , 90, 90 , 70 ) ) Students( Name, Score1,Score2,Score3)
GO

SELECT * FROM #Students
GO

希望大家可以寫超過三種以上的解法


1. 使用 CASE 的作法 ( 如果要判斷的欄位不多是還算簡單 )

SELECT Name, 
	CASE 
		WHEN ( Score1 >= Score2 ) AND ( Score1 >= Score3 ) THEN Score1
		WHEN ( Score2 >= Score1 ) AND ( Score2 >= Score3 ) THEN Score2
		WHEN ( Score3 >= Score1 ) AND ( Score3 >= Score2 ) THEN Score3
	END AS MaxScore
FROM #Students

 

2. 在 SELECT 使用 VALUES 來轉換,我比較喜歡的做法,但可能有些人不習慣這樣的寫法 )

SELECT Name , 
	( SELECT Max(score) 
		FROM ( Values (Score1),(Score2),(Score3)) T(Score) ) AS MaxScore
	FROM #Students

 

3. 利用 UNION 將資料切分多筆,人工作 UNPIVOT 的處理

SELECT Name, Max(Score) MaxScore FROM
(
	SELECT Name, Score1 AS Score
	FROM #Students
	UNION 
	SELECT Name, Score2
	FROM #Students
	UNION 
	SELECT Name, Score3 
	FROM #Students

) Students(Name, Score)
GROUP BY Name

 

4. 跟 3 的做法觀念相同,但改用 UNPIVOT 的指令來處理

SELECT Name, MAX(SCORE) AS MaxScore 
FROM #Students
UNPIVOT ( SCORE FOR DateVal IN ( Score1, Score2, Score3 ) ) AS ScoreTable
GROUP BY Name