2011-09-29 15 views
6

Estoy usando SQL Server 2008;Obtener el valor mínimo entre varias columnas

Supongamos que tengo una tabla 'X' con columnas 'Fecha1', 'Fecha2', 'Fechablah', todo tipo DateTime.

deseo seleccionar el valor mínimo entre las tres columnas, por ejemplo (simplificado, con fecha dd/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 

¿Existe un comando de pan y mantequilla para hacer eso?

Gracias de antemano.

EDIT: He visto esta pregunta What's the best way to select the minimum value from several columns? pero desafortunadamente no me conviene ya que estoy obligado a hacerlo en contra de la normalización porque estoy haciendo informes de artículos de trabajo de tfs, y el caso de 'fuerza bruta' Lo que terminará siendo un dolor si tengo 6 o 7 columnas.

Respuesta

5

No hay función incorporada para devolver el mínimo/máximo de dos (o más) columnas. Podría implementar su propia función escalar para hacer esto.

En SQL Server 2005 + se puede utilizar UNPIVOT para convertir las columnas en filas y luego usar la función 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

Gracias, funciona perfectamente, voy Marcar como respuesta tan pronto como puedo –

+0

acabo tratado de ejecutar este código en mi servidor (SQL Server 2008 R2) y recibió un error relacionado con la última declaración . "Sintaxis incorrecta cerca de 'Fecha'." –

+0

No estoy seguro de por qué está recibiendo esto. ¿Está ejecutando el script a través de SQL Server Management Studio? Lo intenté nuevamente con una instancia de R2 de 2008 y me funciona bien. –

1

La implementación de una función escalar:

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

basado en función escalar (de Tom Hunter):

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

Simplemente digamos que la ta ble donde se encuentran sus fechas se llama sells y tiene dos campos de fecha Date1 y Date2 de los cuales desea el mínimo.

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