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

本文提供了一个有趣的T-SQL练习题目:从学生表中找出每位学生的最高分,并给出了四种不同的解决方案,包括使用CASE语句、VALUES转换、UNION与UNPIVOT指令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内部训练题目

最近在帮部门内的同仁快快乐乐学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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值