トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-294 IDごとに、場合分けで出力行を制御

SQLパズル

priceT
ID    price
----  -----
4720  X
4720  $555
4737  X
4737  X
4737  $999
4782  X
4782  $111
4782  $888
9606  X
9606  X
9613  X
9668  $333

IDごとで、
Xだけなら、Xを1行にまとめて表示し、
X以外があれば、X以外を表示する。

出力結果
ID    price
----  -------
4720  $555
4737  $999
4782  $111
4782  $888
9606  X
9613  X
9668  $333

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table priceT(ID,price) as
select 4720,'X'    from dual union all
select 4720,'$555' from dual union all
select 4737,'X'    from dual union all
select 4737,'X'    from dual union all
select 4737,'$999' from dual union all
select 4782,'X'    from dual union all
select 4782,'$111' from dual union all
select 4782,'$888' from dual union all
select 9606,'X'    from dual union all
select 9606,'X'    from dual union all
select 9613,'X'    from dual union all
select 9668,'$333' from dual;


SQL

--■■■nullif関数を使う方法■■■
select ID,price
  from (select ID,price,
        Row_Number() over(partition by ID order by nullif(price,'X')) as rn
        from priceT)
 where price != 'X' or rn = 1
order by ID,price;

--■■■decode関数を使う方法■■■
select ID,price
  from (select ID,price,
        Row_Number() over(partition by ID order by decode(price,'X',1,0)) as rn
        from priceT)
 where price != 'X' or rn = 1
order by ID,price;


解説

下記の3通りに場合分けして、検証してます。

・Xだけの場合
・XとX以外が存在する場合
・全てX以外の場合