2011-09-29 21 views
6

Sto utilizzando SQL Server 2008;Ottieni il valore minimo tra più colonne

Supponiamo di avere una tabella 'X' con colonne 'Date1', 'Date2', 'Dateblah', tutte di tipo DateTime.

voglio selezionare il valore minimo fra le tre colonne, ad esempio (semplificato, con la data gg/mm/aaaa)

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 

Esiste un comando di pane e burro per farlo?

Grazie in anticipo.

EDIT: Ho visto questa domanda What's the best way to select the minimum value from several columns? ma sfortunatamente non mi andrà bene dato che sono obbligato a farlo contro la normalizzazione perché sto facendo report sugli oggetti di lavoro di tfs, e sul caso 'brute-force' la cosa finirà per essere un dolore se avrò 6 ou 7 colonne.

risposta

5

Non esiste una funzione incorporata per restituire il minimo/massimo di due (o più) colonne. È possibile implementare la propria funzione scalare per fare ciò.

In SQL Server 2005 + è possibile utilizzare UNPIVOT per trasformare le colonne in righe e quindi utilizzare la funzione 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

Grazie, funziona perfettamente, io lo segnaliamo come la risposta al più presto posso –

+0

ho solo cercato di eseguire questo codice sul mio server (SQL Server 2008 R2) e ha ricevuto un errore relativo all'ultima dichiarazione . "Sintassi errata vicino a" Data "." –

+0

Non sono sicuro del motivo per cui stai ricevendo questo. Stai eseguendo lo script tramite SQL Server Management Studio? Ho appena provato di nuovo contro un'istanza R2 2008 e funziona bene per me .. –

1

implementazione di una funzione scalare:

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

sulla base di funzione scalare (da Tom Hunter):

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

Semplicemente diciamo il ta dove sono le date sono chiamate sells e ha due campi data Date1 e Date2 da cui si desidera il minimo.

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