在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函数可以解决我的问题。思考?我很感激!
答案 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)
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