取某一列多行的最大值我们可以直接使用max函数,但是如果取某一行多个列中最大值,则不能直接用max函数了,需要做一些转换(嗯,就是传说中的行列转换)
下表是一个学生成绩表,我们需要得到每个学生各科成绩中的最高分和最低分
----------- ----------- ----------- ----------- ----------- -----------
|学生号 | 语文 | 数学 | 英语 | 物理 | 化学 |
----------- ----------- ----------- ----------- ----------- -----------
|1001 | 89 | 98 | 87 | 63 | 70 |
----------- ----------- ----------- ----------- ----------- -----------
|1002 | 81 | 87 | 79 | 97 | 87 |
----------- ----------- ----------- ----------- ----------- -----------
|1003 | 65 | 86 | 65 | 87 | 84 |
----------- ----------- ----------- ----------- ----------- -----------
|1004 | 87 | 82 | 89 | 84 | 76 |
----------- ----------- ----------- ----------- ----------- -----------
|1005 | 76 | 76 | 87 | 79 | 75 |
----------- ----------- ----------- ----------- ----------- -----------
|1006 | 90 | 68 | 67 | 94 | 90 |
----------- ----------- ----------- ----------- ----------- -----------
|1007 | 56 | 65 | 86 | 69 | 77 |
----------- ----------- ----------- ----------- ----------- -----------
|1008 | 78 | 100 | 83 | 86 | 93 |
----------- ----------- ----------- ----------- ----------- -----------
在这里,我们只需要把每个学生的各科成绩转为一列,然后再MAX最大的分数就可以了。
- /***测试数据***/
- if object_id('[tb]') is not null drop table [tb]
- go
- create table [tb]([学生号] int,[语文] int,[数学] int,[英语] int,[物理] int,[化学] int)
- insert [tb]
- select 1001,89,98,87,63,70 union all
- select 1002,81,87,79,97,87 union all
- select 1003,65,86,65,87,84 union all
- select 1004,87,82,89,84,76 union all
- select 1005,76,76,87,79,75 union all
- select 1006,90,68,67,94,90 union all
- select 1007,56,65,86,69,77 union all
- select 1008,78,100,83,86,93
- /***查询***/
- select
- 学生号,
- 语文,
- 数学,
- 英语,
- 物理,
- 化学,
- (select max(t.a) from (select 语文 as a union select 数学 union select 英语 union select 物理 union select 化学) t) as [最高分],
- (select min(t.a) from (select 语文 as a union select 数学 union select 英语 union select 物理 union select 化学) t) as [最低分]
- from tb
- /***结果***/
- 学生号 语文 数学 英语 物理 化学 最高分 最低分
- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
- 1001 89 98 87 63 70 98 63
- 1002 81 87 79 97 87 97 79
- 1003 65 86 65 87 84 87 65
- 1004 87 82 89 84 76 89 76
- 1005 76 76 87 79 75 87 75
- 1006 90 68 67 94 90 94 67
- 1007 56 65 86 69 77 86 56
- 1008 78 100 83 86 93 100 78
- (所影响的行数为 8 行)
本文介绍了如何在SQL中找出一行多列数据中的最大值和最小值,通过行列转换实现。以学生成绩表为例,展示了查询每个学生各科最高分和最低分的方法。
1938

被折叠的 条评论
为什么被折叠?



