2013-06-20 73 views
0

MSSQL查找其中列有每行一個最大(值

表看起來像這樣

ID 1 | 2 | 3 | 4 | 5 
AA1 1 | 1 | 1 | 2 | 1 

我如何可以做一個查詢任何線索返回

ID | MaxNo 
AA1 | 4 

,usign的上面的表格舉例?我知道我可以在發表聲明時寫一個case blah,但我有一種感覺,有這樣一種更簡單的方法:

+2

能否請您詳細多了,我不明白你的問題很好。我的意思是你想輸出作爲MaxNo ID - >你的意思是把它作爲5和AA1作爲4,我的意思是什麼是計算.. ?? –

+1

他想知道哪列包含每條記錄的最大數量。他的輸出是記錄的ID(行 - AA1),並且包含最大數量(第四列)的列。 –

+0

@RaduGheorghiu這是正確的,我想不出更好的解釋方式,你能幫忙嗎? – Waller

回答

3

可以使用UNPIVOT得到這些可比項目,正確,到列,然後用ROW_NUMBER()找到價值最高的行:

declare @t table (ID char(3) not null,[1] int not null,[2] int not null, 
       [3] int not null,[4] int not null,[5] int not null) 
insert into @t (ID,[1],[2],[3],[4],[5]) values 
('AA1',1,1,1,2,1) 

;With Unpivoted as (
select *,ROW_NUMBER() OVER (ORDER BY Value desc) rn 
from @t t UNPIVOT (Value FOR Col in ([1],[2],[3],[4],[5])) u 
) 
select * from Unpivoted where rn = 1 

結果:

ID Value  Col      rn 
---- ----------- ------------------------- -------------------- 
AA1 2   4       1 

如果您有山姆的數據e「域」出現在同一個表中的多列中(因此它甚至使感知來比較這些值),它通常是屬性拆分的標誌,其中部分數據錯誤地用於形成一列名稱

在你的問題中,你說「每行」,但你只給了一行樣本。如果我們假設ID值對於每一行都是唯一的,並且您希望分別爲每個ID找到最大值,那麼您會編寫ROW_NUMBER()作爲ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Value desc) rn,以獲得(我希望)您正在查找的結果。

2

對於一行的列,您可以使用跨應用max()

select T1.ID, 
     T2.Value 
from YourTable as T1 
    cross apply 
    (
    select max(T.Value) as Value 
    from (values (T1.[1]), 
       (T1.[2]), 
       (T1.[3]), 
       (T1.[4]), 
       (T1.[5])) as T(Value) 
    ) as T2 

如果你是SQL Server 2005上,你可以在派生表中使用union all,而不是values()

select T1.ID, 
     T2.Value 
from YourTable as T1 
    cross apply 
    (
    select max(T.Value) as Value 
    from (select T1.[1] union all 
      select T1.[2] union all 
      select T1.[3] union all 
      select T1.[4] union all 
      select T1.[5]) as T(Value) 
    ) as T2 

SQL Fiddle

相關問題