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

10-145 having句でdecode関数

SQLパズル

T1テーブル
ID  Code
--  ----
 1    X
 1    X
 1    Y
 2    X
 2    Y
 3    X
 3    X
 3    Y
 3    Y
 4    X
 4    X
 5    Y
 5    Y

IDごとで、
Code = 'X' のレコードが2件だけ存在し、
かつ
Code = 'Y' のレコードが1件だけ存在する
IDを出力する

出力結果
ID
--
 1

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


データ作成スクリプト

create table T1 as
select 1 as ID,'X' as Code from dual
union all select 1,'X' from dual
union all select 1,'Y' from dual
union all select 2,'X' from dual
union all select 2,'Y' from dual
union all select 3,'X' from dual
union all select 3,'X' from dual
union all select 3,'Y' from dual
union all select 3,'Y' from dual
union all select 4,'X' from dual
union all select 4,'X' from dual
union all select 5,'Y' from dual
union all select 5,'Y' from dual;


SQL

select ID
  from T1
 where Code in('X','Y')
group by ID
having sum(decode(Code,'X',1,0)) = 2
   and sum(decode(Code,'Y',1,0)) = 1;


解説

having句で、
sum関数とdecode関数を組み合わせてます