2011-11-03 18 views
6

Tengo la siguiente consulta:¿Cómo modifico esta consulta t-sql para devolver el valor máximo para diferentes nombres de columna?

SELECT 
     [Rate], 
     [RateMon], 
     [RateTue], 
     [RateWed], 
     [RateThu], 
     [RateFri], 
     [RateSat], 
     [RateSun] 
    FROM 
     [Room] 
    WHERE 
     [email protected] 

En lugar de devolver todas las columnas, sólo quiero volver Rate y el valor máximo entre RateMon, RateTue, RateWed, RateThu, RateFri, RateSat y RateSun, pero Estoy teniendo un momento difícil porque los nombres de las columnas son diferentes.

Un ejemplo de retorno resultado actual es:

100, 400, 400, 400, 400, 600, 600, 600

donde 100 es la Tasa y los otros valores corresponden a Lun - Dom, pero Quiero devolver solo 100 y 600 en este caso.

+0

por favor, puesto datos de ejemplo y los resultados. No está claro lo que estás buscando. – Oded

+0

posible duplicado de [SQL MAX de varias columnas?] (Http://stackoverflow.com/questions/71022/sql-max-of-multiple-columns) –

+0

posible duplicado de [Función en SQL Server 2008 similar a GREATEST en mysql ?] (http://stackoverflow.com/questions/4725823/function-in-sql-server-2008-similar-to-greatest-in-mysql) –

Respuesta

8
SELECT [Rate], 
     (SELECT MAX(T.[Rate]) 
     FROM (VALUES([RateMon]), 
        ([RateTue]), 
        ([RateWed]), 
        ([RateThu]), 
        ([RateFri]), 
        ([RateSat]), 
        ([RateSun])) AS T([Rate]) 
     ) AS MaxRate 
FROM [Room] 
WHERE [email protected] 
+0

La mejor respuesta porque es más succint. – Xaisoft

+0

+1 ¡Guau, no sabía que podía usar 'valores' fuera de la inserción! – Andomar

+0

No estoy seguro si debería aceptarlo porque eres de Suecia y soy parte noruego :) Es broma. – Xaisoft

1

Usted puede usar algo como detallado:

SELECT Rate, 
    CASE 
    WHEN RateMon>=RateTue AND RateMon>=RateWed AND RateMon>=RateThu AND 
     RateMon>=RateFri AND RAteMon>=RateSat AND RateMon>=RateSun THEN RateMon 
    WHEN RateTue>=RateMon AND RateTue>=RateWed AND RateTue>=RateThu AND 
     RateTue>=RateFri AND RateTue>=RateSat AND RateTue>=RateSun THEN RateTue 
    WHEN RateWed>=RateMon AND RateWed>=RateTue AND RateWed>=RateThu AND 
     RateWed>=RateFri AND RateWed>=RateSat AND RateWed>=RateSun THEN RateWed 
    WHEN RateThu>=RateMon AND RateThu>=RateTue AND RateThu>=RateWed AND 
     RateThu>=RateFri AND RateThu>=RateSat AND RateThu>=RateSun THEN RateThu 
    WHEN RateFri>=RateMon AND RateFri>=RateTue AND RateFri>=RateWed AND 
     RateFri>=RateThu AND RateFri>=RateSat AND RateFri>=RateSun THEN RateFri 
    WHEN RateSat>=RateMon AND RateSat>=RateTue AND RateSat>=RateWed AND 
     RateSat>=RateThu AND RateSat>=RateFri AND RateSat>=RateSun THEN RateSat 
    WHEN RateSun>=RateMon AND RateSun>=RateTue AND RateSun>=RateWed AND 
     RateSun>=RateThu AND RateSun>=RateFri AND RateSun>=RateSat THEN RateSun 
    END AS MaxRate 
FROM  
    [Room]  
WHERE  
    [email protected] 

escribir mucho, pero eso es una respuesta posible. También puede hacer lo siguiente, que es ligeramente inferior a escribir:

SELECT Rate, MAX(Rates.Rate) AS MaxRate 
    FROM  
    [Room], 
     (SELECT RateMon AS Rate FROM [Room] WHERE [email protected] UNION 
     SELECT RateTue AS Rate FROM [Room] WHERE [email protected] UNION 
     SELECT RateWed AS Rate FROM [Room] WHERE [email protected] UNION 
     SELECT RateThu AS Rate FROM [Room] WHERE [email protected] UNION 
     SELECT RateFri AS Rate FROM [Room] WHERE [email protected] UNION 
     SELECT RateSat AS Rate FROM [Room] WHERE [email protected] UNION 
     SELECT RateSun AS Rate FROM [Room] WHERE [email protected]) 
    AS Rates 
    WHERE  
    [email protected] 

Por supuesto, la solución correcta sería para normalizar su base de datos y hacer de este discutible, ya que se unen de forma sencilla y agregada sería suficiente.

+0

Wow eso es enorme. Gracias, voy a intentarlo. Se podría pensar que habría algo más simple, como dar un conjunto de columnas, devolver el valor máximo en lugar de tener que hacerlo con toda esta lógica de casos. – Xaisoft

+0

Hay en MySql (MAYOR) pero no en SQL Server. –

+0

Sí, lo leí en la otra publicación. Me pregunto si sería en una versión futura de SQL Server. – Xaisoft

1

Se podría UNPIVOT los días con una subconsulta union:

select Rate 
,  max(DayRate) 
from (
     select ID, Rate, RateMon as DayRate from Room 
     union all 
     select ID, Rate, RateTue from Room 
     union all 
     select ID, Rate, RateWed from Room 
     union all 
     .... 
     ) as SubQuery 
where ID = @ID 
group by 
     Rate 
Cuestiones relacionadas