3

SQL (SQL 服务器)

如何在 SQL 查询返回的单个表行中的不同列之间找到最大值。

Select Maximum(table.column1,table.column2,table.column3,...) as 'MaximumValue' 
 from table
4

4 回答 4

4

在 SQL Server 2008 及更高版本中,您可以编写类似的查询来查找列中的最大值:

select col1
     , col2
     , col3
     , col4
     ,(select max(mx) 
         from (values(col1)
                     ,(col2)
                     ,(col3)
                     ,(col4)) t1(mx)
                ) as MaximumValue
from t1

SQL 小提琴演示

于 2013-07-27T11:44:10.013 回答
3

解决方案 #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;
于 2013-07-27T11:40:03.587 回答
1

您已经用两个完全不同的数据库标记了它。在 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顺便说一句,在这两种情况下,如果列可以包含值,您必须小心。

于 2013-07-27T11:33:33.433 回答
1

这可能不是最好的解决方案,但它可以按预期工作(在 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

于 2013-07-29T08:47:59.120 回答