2011-11-03 5 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レートであり、他の値は、月に対応

100、400、400、400、400、600、600、600

- 太陽に、しかし私はこのケースではわずか100と600に戻りたいと思っています。タイピングの

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] 

多くのことを、それは一つの可能​​な答えです:あなたが何かを使用することができます

+0

例のデータと結果を投稿してください。あなたが探しているものは明確ではありません。 – Oded

+0

[複数の列のSQL最大?](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うわー、あなたは挿入の外側に '値'を使うことができるのか分かりませんでした! – Andomar

+0

あなたがスウェーデン出身で、私がノルウェー人なので、私がそれを受け入れるべきかどうかはわかりません:)ちょうど冗談です。 – Xaisoft

1

は冗長好きです。単純結合と集計が十分であることから、当然のことながら

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

あなたは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 
関連する問題