在SQL Server 2008中的列之间返回最大值

时间:2014-08-12 19:26:49

标签: sql sql-server sql-server-2008 tsql

在SQL Server 2008中,我需要跨T-SQL中的列进行查询并返回我找到的最大数字(下面的示例使用日期,但同样的想法适用于数字)。 “NULL”表示空值,而不是文字(抱歉,如果我是队长明显的话)。 “DesiredResultColumn”列显示了我希望从Column1到Column3搜索的最终结果。我在这里找不到一个恰好适合这个的例子。


    ID       Column1    Column2     Column3        DesiredResultColumn
    001      1/1/2010   5/7/2011    8/12/2008      5/7/2011
    002      7/1/2014   7/3/2012    10/12/2013     7/1/2014
    003      9/1/2012   12/7/2012   NULL           12/7/2012
    004      11/1/2012  NULL        8/12/2013      8/12/2013

不幸的是,由于源系统的限制,我的表没有规范化,否则max函数可以解决我的问题。思考?我很感激!

3 个答案:

答案 0 :(得分:0)

您可以使用case条件和ISNULL()来获得如下结果(示例,未使用ISNULL()进行无效检查。您可以包含)

select ID,
       Column1,
       Column2,
       Column3,
       case when Column1 > Column2 and Column1 > Column3 then Column1 
            when Column2 > Column1 and Column2 > Column3 then Column2
            else column3 end as DesiredResultColumn
from your_table

答案 1 :(得分:0)

根据similar question

SELECT tbl.ID,
       (SELECT MAX(Date)
        FROM (VALUES (tbl.Column1), (tbl.Column2), (tbl.Column3)) AS AllDates(Date)) AS DesiredResultColumn
FROM tbl

当然,这只适用于SQL 2008及更高版本,但是你说你有2008年,所以应该没问题。

关于使用CASE或类似表达式的好处是,对于一个人来说,它有点短,在我看来,更容易阅读。但是,它处理NULL值,因此您不必考虑它们。

答案 2 :(得分:0)

测试数据

DECLARE @TABLE TABLE (ID VARCHAR(10), Column1 DATE, Column2 DATE, Column3 DATE)       

INSERT INTO @TABLE VALUES 
('001','1/1/2010','5/7/2011','8/12/2008'),      
('002','7/1/2014','7/3/2012','10/12/2013'),     
('003','9/1/2012','12/7/2012',   NULL    ),    
('004','11/1/2012',   NULL   ,'8/12/2013')

查询

;WITH CTE
AS (    
    SELECT *
    FROM @TABLE 
    UNPIVOT ( Dates FOR ColumnName IN (Column1, Column2,Column3) )up
   )
SELECT t.ID , t.Column1, t.Column2, t.Column3, MAX(Dates) Highest_Date
FROM @TABLE t LEFT JOIN CTE C
ON t.ID = c.ID
GROUP BY t.ID , t.Column1, t.Column2, t.Column3

结果

╔═════╦════════════╦════════════╦════════════╦══════════════╗
║ ID  ║  Column1   ║  Column2   ║  Column3   ║ Highest_Date ║
╠═════╬════════════╬════════════╬════════════╬══════════════╣
║ 001 ║ 2010-01-01 ║ 2011-05-07 ║ 2008-08-12 ║ 2011-05-07   ║
║ 002 ║ 2014-07-01 ║ 2012-07-03 ║ 2013-10-12 ║ 2014-07-01   ║
║ 003 ║ 2012-09-01 ║ 2012-12-07 ║ NULL       ║ 2012-12-07   ║
║ 004 ║ 2012-11-01 ║ NULL       ║ 2013-08-12 ║ 2013-08-12   ║
╚═════╩════════════╩════════════╩════════════╩══════════════╝

SQL FIDDLE

相关问题