2015-05-08 43 views
0

我會盡我所能解釋我需要什麼。我有一個連接多個表的查詢。我無法發佈實際查詢,所以我會舉一個例子。如何爲列值指定排名,並且只顯示SQL中每個訂單項的最高排名值?

左表(表A)包含50個唯一的序列號。查詢輸出必須始終每個唯一序列號只返回一行。其中一個表(表B)我加入(在序列號值上)在我選擇的其中一列中有多個值。列是狀態,並且值是已安裝,DOA或缺失。一個序列號在狀態列中可以有多個值,這將導致一個序列有多個行。

因此,如果序列號1234有一個已安裝的記錄和一個DOA記錄,那麼我得到的是該序列的兩個行而不是一個,這意味着查詢的輸出給了我51行,其中有一個重複的序列號而不是50行。

我想爲狀態列值分配等級,例如Installed = 1,DOA = 2,Missing = 3。我希望查詢只顯示最高排名值,如果沒有值,則顯示NULL。

如果一個串行有一個安裝的記錄和一個DOA記錄,它顯示在輸出中安裝,如果它有一個DOA但沒有安裝,那麼它顯示DOA。

我得到什麼:

TABLE A SN TABLE B SN TABLE B STATUS 
1234  1234  Installed 
1234  1234  DOA 
5678  5678  DOA 

我想要什麼:

TABLE A SN TABLE B SN TABLE B STATUS 
1234  1234  Installed 
5678  5678  DOA 

這是可能做到這一點的SQL,如果不是有其他的功能,我可以用它來達到同樣的結果?

+0

是否有過情況下,當有兩個記錄具有相同安裝狀態和SN,如果是你希望它選擇一個還是兩者都返回?如果你只想每個SN有一行,下面的答案就可以工作。 – APH

回答

0

有多種方法可以做你想做的事。下面是使用outer applychoose()一個方法:

select a.sn. b.* 
from tablea a outer apply 
    (select top 1 b.* 
     from tableb b 
     where b.sn = a.sn 
     order by choose(b.status, 'Installed', 'DOA', 'Missing') 
    ) b; 

注:由「最高等級」我不知道的順序是什麼。您可能需要上的desc

1

下面是使用row_number()有條件訂購一個選項:

with cte as (
    select a.sn asn, b.sn bsn, b.status, 
     row_number() over (partition by a.sn 
      order by 
       case when b.status = 'Installed' then 1 
        when b.status = 'DOA' then 2 
        when b.status = 'Missing' then 3 
       end) rn 
    from tablea a 
     left join tableb b on a.sn = b.sn 
) 
select asn, bsn, status 
from cte 
where rn = 1 
相關問題