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

5-61 その他を考慮した集計

SQLパズル

MasterTable     SumTable
Code  Name      Code  Val
----  -----     ----  ---
   0  etc          0    2
   1  Name1        1    4
   2  Name2        3    8
   3  Name3        3   16
                   9   32

MasterTableのCodeごとに集計する。

Code=0のデータと、
SumTableにあるが、MasterTableにないデータは、
etcとして集計する。

出力結果
Code  Name   SumVal
----  -----  ------
   0  etc        34
   1  Name1       4
   2  Name2       0
   3  Name3      24


データ作成スクリプト

create table MasterTable(Code,Name) as
select 0,'etc'   from dual union
select 1,'Name1' from dual union
select 2,'Name2' from dual union
select 3,'Name3' from dual;

create table SumTable(Code,Val) as
select 0, 2 from dual union
select 1, 4 from dual union
select 3, 8 from dual union
select 3,16 from dual union
select 9,32 from dual;


SQL

select nvl(a.Code,0) as Code,
       nvl(a.Name,'etc') as Name,
       nvl(sum(b.Val),0) as Val
  from MasterTable a full Join SumTable b
    on (a.Code = b.Code)
group by nvl(a.Code,0),nvl(a.Name,'etc')
order by nvl(a.Code,0);


解説

完全外部結合で和集合を求めてます。
ベン図を脳内でイメージしつつ
3通りの場合わけを行うと、分かりやすいでしょう。