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

10-154 集合が条件を満たすかで分岐

SQLパズル

test1テーブル
Col1  Col2
----  ----
 100     1
 100     1
 102     1
 102     0
 102     1
 104     0
 104     0

Col1ごとで、
Col2が全て1なら、OK
そうでないなら、NG
を出力する

出力結果
Col1  Col2
----  ----
 100  OK
 102  NG
 104  NG

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


データ作成スクリプト

create table test1 as
select 100 as Col1,'1' as Col2 from dual
union all select 100,'1' from dual
union all select 102,'1' from dual
union all select 102,'0' from dual
union all select 102,'1' from dual
union all select 104,'0' from dual
union all select 104,'0' from dual;


SQL

select Col1,
case min(decode(Col2,'1',1,0))
when 0 then 'NG'
else 'OK' end as Col2
from test1
group by Col1
order by Col1;


解説

min関数とdecode関数を組み合わせて、存在有無のブールを求めて、
単純case式を使ってます。

windowsのエクスプローラで
拡張子の昇順にソートして先頭がjpg
拡張子の降順にソートして先頭がjpg
ならjpgしか存在しない
という考え方でもあります。

9-18 存在有無のブール値を求める
9-48 集合で考える

集合で考える ―― HAVING句の力:その2
Thinking in Aggregates(英語)