トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
10-199 同じ行で最大の列かを調べる
SQLパズル
ValTable
ID ColA ColB ColC
-- ---- ---- ----
1 100 200 300
2 600 500 400
3 700 900 800
4 null null null
5 null null 100
6 null 200 null
7 300 null null
8 400 null 500
9 null 700 600
10 100 100 100
11 null 200 200
行ごとに、ColA,ColB,ColCの値を比較して、
最大の列ならYに
最大の列でないならNを設定する。
なお、nullは最も小さいとみなします。
出力結果
ID ColA ColB ColC FlagA FlagB FlagC
-- ---- ---- ---- ----- ----- -----
1 100 200 300 N N Y
2 600 500 400 Y N N
3 700 900 800 N Y N
4 null null null Y Y Y
5 null null 100 N N Y
6 null 200 null N Y N
7 300 null null Y N N
8 400 null 500 N N Y
9 null 700 600 N Y N
10 100 100 100 Y Y Y
11 null 200 200 N Y Y
データ作成スクリプト
create table ValTable(ID,ColA,ColB,ColC) as
select 1, 100, 200, 300 from dual union
select 2, 600, 500, 400 from dual union
select 3, 700, 900, 800 from dual union
select 4,null,null,null from dual union
select 5,null,null, 100 from dual union
select 6,null, 200,null from dual union
select 7, 300,null,null from dual union
select 8, 400,null, 500 from dual union
select 9,null, 700, 600 from dual union
select 10, 100, 100, 100 from dual union
select 11,null, 200, 200 from dual;
SQL
Col FlagA for a8
Col FlagB for a8
Col FlagC for a8
select ID,ColA,ColB,ColC,
decode(ColA,MaxVal,'Y','N') as FlagA,
decode(ColB,MaxVal,'Y','N') as FlagB,
decode(ColC,MaxVal,'Y','N') as FlagC
from (select ID,ColA,ColB,ColC,
greatest(coalesce(ColA,ColB,ColC),
coalesce(ColB,ColA,ColC),
coalesce(ColC,ColA,ColB)) as MaxVal
from ValTable)
order by ID;
解説