内部训练题目
最近在帮部门内的同仁快快乐乐学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