2011-09-29 72 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