2011-09-29 96 views
6

我正在使用SQL Server 2008;获取几列之间的最小值

假设我有一个表'X',列'Date1','Date2','Dateblah',所有类型的DateTime。

我想选择三个列之间的最小值,例如(简化,日期月/日/年)

ID  Date1   Date2   Dateblah 
0  09/29/2011  09/20/2011  09/01/2011 
1  01/01/2011  01/05/2011  03/03/2010 

ID MinDate 
0 09/01/2011 
1 03/03/2010 

是否有奶油面包命令这样做呢?

在此先感谢。

编辑:我已经看到这个问题What's the best way to select the minimum value from several columns?,但不幸的是,它不会适合我,因为我有责任做到这一点,因为我正在制作工作项目报告和“蛮力”案件如果我有6或7列,事情最终会变成一场痛苦。

回答

5

没有内置的函数来返回两个(或更多)列的最小/最大值。你可以实现你自己的标量函数来做到这一点。

在SQL Server 2005 +,你可以使用UNPIVOT转列到行,然后使用MIN功能:

CREATE TABLE [X] 
(
    [ID] INT, 
    [Date1] DATETIME, 
    [Date2] DATETIME, 
    [Date3] DATETIME 
) 

INSERT [X] 
VALUES (0, '09/29/2011', '09/20/2011', '09/01/2011'), 
     (1, '01/01/2011', '01/05/2011', '03/03/2010') 


SELECT [ID], MIN([Date]) AS [MinDate] 
FROM [X] 
UNPIVOT (
    [Date] FOR d IN 
     ([Date1] 
     ,[Date2] 
     ,[Date3]) 
) unpvt 
GROUP BY [ID] 
+0

谢谢你,它完美的作品,我会回答尽快标记为我能 –

+0

我只是想我的服务器(SQL Server 2008 R2中)上运行此代码,并获得相关的最后一条语句错误。 “日期附近语法不正确”。“ –

+0

我不确定你为什么得到这个。您是否通过SQL Server Management Studio运行脚本?我刚刚尝试了一次2008 R2的实例,它对我来说工作正常.. –

1

实现一个标量函数:基于标量函数

CREATE FUNCTION [dbo].[MIN](@a SQL_VARIANT, @b SQL_VARIANT) 
RETURNS SQL_VARIANT 
AS 
BEGIN 
    RETURN (
     SELECT MIN([x]) 
     FROM (VALUES(@a),(@b)) x([x]) 
    ) 
END 
GO 

DECLARE @a DATETIME = '12 JUL 2011', @b DATETIME = '20 AUG 2011' 
SELECT [dbo].[MIN](@a, @b) 

DECLARE @c INT = 12, @d INT = 32 
SELECT [dbo].[MIN](@c, @d) 
8

(从Tom Hunter):

SELECT ID, (SELECT MIN([date]) FROM (VALUES(Date1),(Date2),(Dateblah)) x([date])) MinDate 
FROM TableName 
0

只要让我们说ta你的日期在哪里叫sells,它有两个日期字段Date1Date2你想从中获得最小值。

SELECT ( 
    SELECT MIN([x]) 
    FROM (VALUES(Date1),(Date2)) x([x]) 
) as minimum 
FROM sells