2014-05-19 76 views
0

我想按列選擇distinct/group並僅顯示第二列中的一個值(3個可能中的一個)優先級:如果A出現在組中,則顯示它,如果不顯示B,如果沒有顯示C選擇不同列,優先第二列值

這是表:

A  B 
---- ----- 
FST  A 
FST  B 
FST  C 
INCS C 
INCS B 
ASW  A 
AWR  C 
WER  C 
WER  C 
WER  B 

結果

A  B 
---- ----- 
FST  A 
INCS B 
ASW  A 
AWR  C 
WER  B 
+0

是否使用SQL的一個特定的味道? – Strawberry

+0

oracle 11g,儘可能優化.. – Nir

回答

4

爲您給出的數據,最簡單的方法是:

select A, min(B) 
from table t 
group by A; 

對於更一般的問題,即字母排序不正確(如果你想在'A'之前返回'B',說),你可以用case st atements:

select A, 
     (case min(case B when 'A' then 1 when 'B' then 2 when 'C' then 3 else 4 end) 
      when 1 then 'A' 
      when 2 then 'B' 
      when 3 then 'C' 
      else '???' 
     end) 
from table t 
group by A; 

編輯:

Oracle有一個更簡單的方法來做到這一點比嵌套的選擇:

select A, 
     max(B) keep (dense_rank first 
        order by (case B when 'A' then 1 when 'B' then 2 when 'C' then 3 else 4 end) 
        ) as BestB 
from table t 
group by A; 
+0

有沒有方法可以將'LIKE'運算符集成到'case'操作中? – Nir

+1

@nir:是的。 '當B像'A%'那樣的情況下,那麼1當B像'B%'那麼2 ...' –

相關問題