SQL (SQL 服务器)
如何在 SQL 查询返回的单个表行中的不同列之间找到最大值。
Select Maximum(table.column1,table.column2,table.column3,...) as 'MaximumValue'
from table
SQL (SQL 服务器)
如何在 SQL 查询返回的单个表行中的不同列之间找到最大值。
Select Maximum(table.column1,table.column2,table.column3,...) as 'MaximumValue'
from table
在 SQL Server 2008 及更高版本中,您可以编写类似的查询来查找列中的最大值:
select col1
, col2
, col3
, col4
,(select max(mx)
from (values(col1)
,(col2)
,(col3)
,(col4)) t1(mx)
) as MaximumValue
from t1
解决方案 #1(仅限 SQL Server 2005+):
DECLARE @MyTable TABLE(Col1 INT,Col2 INT,Col3 INT,Col4 INT);
INSERT @MyTable (Col1,Col2,Col3,Col4)
VALUES (1,2,3,4);
INSERT @MyTable (Col1,Col2,Col3,Col4)
VALUES (100,20,300,40);
INSERT @MyTable (Col1,Col2,Col3,Col4)
VALUES (NULL,NULL,NULL,NULL);
INSERT @MyTable (Col1,Col2,Col3,Col4)
VALUES (NULL,1000,NULL,NULL);
SELECT x.*,z.*
FROM @MyTable x
CROSS APPLY(
SELECT MAX(y.Value) AS MaxOfValue,SUM(y.Value) AS SumOfValue
FROM(
SELECT x.Col1 AS Value
UNION ALL
SELECT x.Col2
UNION ALL
SELECT x.Col3
UNION ALL
SELECT x.Col4
) y
) z;
结果:
Col1 Col2 Col3 Col4 MaxOfValue SumOfValue
---- ---- ---- ---- ---------- ----------
1 2 3 4 4 10
100 20 300 40 300 460
NULL NULL NULL NULL NULL NULL
NULL 1000 NULL NULL 1000 1000
演示<- 点击
解决方案 #2(SQL Server 2005+,Oracle)SQLFiddle 演示(您可以在 SQL Server 和 Oracle 之间切换)
SELECT a.*,b.MaxOfValue
FROM MyTable a
LEFT JOIN (
SELECT unpvt.ID,
MAX(unpvt.Value) AS MaxOfValue
FROM MyTable x
UNPIVOT( Value FOR ColumnName IN (Col1,Col2,Col3,Col4) )unpvt
GROUP BY unpvt.ID
) b ON a.ID=b.ID;
您已经用两个完全不同的数据库标记了它。在 Oracle 中,您可以:
select greatest(col1, col2, col3, . . .)
SQL Server 没有greatest()
函数,所以你可以使用一个巨大的 case 语句:
(case when col1 >= col2 and col1 >= col3 and col1 >= . . . then col1
when col2 >= col3 and col2 >= . . .
. . .
end)
NULL
顺便说一句,在这两种情况下,如果列可以包含值,您必须小心。
这可能不是最好的解决方案,但它可以按预期工作(在 SQL Server 2005+ 上):
DECLARE @x xml= N''
SELECT t.col1, t.col2, t.col3, t.col4,
@x.value('fn:max((sql:column("t.col1"),
sql:column("t.col2"),
sql:column("t.col3"),
sql:column("t.col4")))', 'int')
FROM dbo.test140 t
见演示SQLFiddle