2011-11-03 66 views
6

我有以下查詢:如何修改此t-sql查詢以返回不同列名的最大值?

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

,而不是返回所有列的,我只是想回到Rate和RateMon,RateTue,RateWed,RateThu,RateFri,RateSat和RateSun之間的最大價值,但我由於列名是不同的,所以我很難過。

一個例子結果恢復現在是:

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

其中100是速度和其他值對應於週一 - 週日,但我想在這種情況下返回100和600。

+0

請張貼例如數據和結果。目前還不清楚你在找什麼。 – Oded

+0

可能重複[多列SQL MAX]?(http://stackoverflow.com/questions/71022/sql-max-of-multiple-columns) –

+0

[SQL Server 2008中的函數類似於MySQL中的GREATEST ?](http://stackoverflow.com/questions/4725823/function-in-sql-server-2008-similar-to-greatest-in-mysql) –

回答

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

最好的答案,因爲它是最令人生氣的。 – Xaisoft

+0

+1哇,不知道你可以在插入外面使用'values'! – Andomar

+0

不知道是否應該接受,因爲你來自瑞典,我是挪威的一部分:)只是在開玩笑。 – Xaisoft

1

您可以使用一些詳細的喜歡:

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] 

很多打字的,但是這是一個可能的答案。你也可以做到以下幾點,這是打字略少:

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] 

當然,正確的解決方案將正常化您的數據庫,使這個沒有實際意義,因爲一個簡單的連接和分組聚集就足夠了。

+0

哇,這是巨大的。謝謝,我會給它一個機會。你可能會認爲會有更簡單的事情,比如給定一組列,返回最大值而不是所有這種情況下的邏輯。 – Xaisoft

+0

MySql上有(GREATEST),但不在SQL Server上。 –

+0

是的,我在另一個帖子上看到了。我想知道它是否會在未來的SQL Server發佈。 – Xaisoft

1

你可以unpivot的日子與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