トップページに戻る    次の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;


解説

decode関数は、nullとnullを等しいとみなすことを使ってます。

10-179 同一行で最大のデータを求める