2017-09-06 12 views
1

oracle 11gデータベースでSQL文を実行しています。出力には、いくつかの結合で、次のようなものですoracleデータベースのcase.whenの使用方法

 
id | document  | address 
---+----------------+-------------- 
1 | identity_card | hudson street 
1 | driver_licence | hudson street 
1 | passport  | hudson street 
1 | identity_card | mike street 
1 | driver_licence | mike street 
1 | passport  | mike street 
2 | driver_licence | laura street 
2 | passport  | laura street 
3 | passport  | amy street 
3 | identity_card | bug street 
3 | identity_card | apple street 
3 | passport  | bug street 
4 | driver_licence | 16th street 
5 | identity_card | 21st street 

しかし、私はそれはそれのようなものになりたい(そこに他の列がありますが、重要な列は、これらのものです):として

 
id | document  | address 
---+----------------+-------------- 
1 | identity_card | hudson street 
1 | identity_card | mike street 
2 | passport  | laura street 
3 | identity_card | bug street 
3 | identity_card | apple street 
4 | driver_licence | 16th street 
5 | identity_card | 21st street 

あなたは私が各IDを見ているのを見ているかもしれません、もしIDがID_cardを文書として持っていれば、私はその行をとります。 IDカードは持っていないがパスポートを持っているなら、私はその行を持っています。身分証明書とパスポートがないと私はdriver_licenceを取る。

どうすればいいですか?私は "ケース..."を使うことができると思うが、私の場合には "ケース..."を適用する方法を理解できなかった。

ありがとうございます!

答えて

3

一つの方法は、dense_rank()使用しています:

select t.* 
from (select t.*, 
      dense_rank() over (partition by id 
           order by case when document = 'identity_card' then 1 
               when document = 'passport' then 2 
               when document = 'drivers_license' then 3 
               else 4 
             end) as seqnum 
     from t 
    ) t 
where seqnum = 1; 
1

あなた既存のクエリ、追加:

, rank() over (partition by id order by case document when 'identity_card' then 1 
                 when 'passport'  then 2 
                 when ...................... 
                 ........................... 
             end) as rnk 

その後、外側のクエリでは、すべてのものを選択し、[追加

where rnk = 1 
関連する問題