2011-11-03 13 views
6

Aşağıdaki sorgu var:Farklı sütun adları için maksimum değeri döndürmek için bu t-sql sorgusunu nasıl değiştirebilirim?

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

yerine tüm sütunları dönüş, sadece Rate dönmek istiyorum ve RateMon, RateTue, RateWed, RateThu, RateFri, RateSat ve RateSun arasındaki maksimum değer, ama ben zor bir zaman geçiriyorum çünkü sütun isimleri farklı.

bir örnek sonuç dönüş artık:

100, 400, 400, 400, 400, 600, 600, 100 Oranı ve diğer değerler ise 600

Mon karşılık - Sun, ancak Bu durumda sadece 100 ve 600 dönmek istiyorum. Yazmaktan

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] 

bir sürü var; ama bu mümkün cevabı: Bir şey kullanabilirsiniz

+0

örnek veri ve sonuçları gönderin. Aradığın şey net değil. – Oded

+0

olası çoğul [SQL MAX çoklu sütunlar?] (Http://stackoverflow.com/questions/71022/sql-max-of-multiple-columns) –

+0

olası yinelenen [SQL Server 2008'deki işlev mysql'deki GREATEST'e benzer ?] (http://stackoverflow.com/questions/4725823/function-in-sql-server-2008-similar-to-greatest-in-mysql) –

cevap

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

En iyi cevap, çünkü en başarılı. – Xaisoft

+0

+1 Wow, 'value 'dış insertini kullanabileceğinizi bilmiyordum! – Andomar

+0

Bunu kabul etsem de emin değilim, çünkü İsveçli ve ben Norveçli olduğum için :) Sadece şaka yapıyorum. – Xaisoft

1

ayrıntılı gibi. Basit katılmak ve agrega yeterli olacaktır, çünkü Tabii

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] 

, veritabanını normalleştirmek ve bu tartışmalı hale olacaktır doğru çözüm: Sen biraz daha az yazarak olan aşağıdakileri yapın da olabilir.

+0

Vay o kadar büyük. Teşekkürler, bir şans vereceğim. Bir dizi sütun verildiği gibi daha basit bir şey olacağını düşünürdüm, tüm bu vaka mantığına sahip olmak yerine maksimum değeri döndür. – Xaisoft

+0

MySql (GREATEST) var, ancak SQL Server'da yok. –

+0

Evet, bunu diğer gönderide okudum. SQL Server'ın gelecekteki bir releas içinde olacağını merak ediyorum. – Xaisoft

1

Bir union alt sorgu ile gün UNPIVOT olabilir:

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 
İlgili konular