SQL Server 2008中跨列返回最大值

3
在SQL Server 2008中,我需要使用T-SQL跨列查询并返回我找到的最大数值(以下示例使用日期,但相同的想法适用于数字)。“NULL”表示空值,而不是文字“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

很不幸,由于源系统的限制,我的表格并没有进行规范化,否则使用最大函数就可以解决我的问题。有什么想法吗?非常感谢!


应该输出什么? - juergen d
最后一列“DesiredResultColumn”是期望的最终结果。我会在问题中澄清,谢谢。 - Clint Finch
1
请像https://dev59.com/sXVD5IYBdhLWcg3wAGeD#124474那样编写一个UDF。 - Yuriy Galanter
1
你可以使用case条件和ISNULL()一起来获取结果。 - Rahul
1
请尝试Sven在https://dev59.com/s3VD5IYBdhLWcg3wJIEK#6871572中的答案。 - AHiggins
我刚刚发现,@AHiggins - 这正是我所需要的。你太棒了。 - Clint Finch
3个回答

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

@M.Ali,这是因为我没有检查NULL,而ID 3在其中一列上有NULL,这在我的答案中已经清楚地提到了,我想你可能错过了。 - Rahul

0
根据一个类似的问题
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值,因此您不必考虑它们。

完美,马修。谢谢你。这与Sven在https://dev59.com/s3VD5IYBdhLWcg3wJIEK#6871572中的答案相同。这个好处也在于它很容易引用代码中的许多连接表。 - Clint Finch

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

{{链接1:SQL FIDDLE}}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接