2011-11-03 71 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