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

5-45 和集合を作成して総合計を取得

SQLパズル

商品テーブル
コード
------
 A01
 A02
 A03
 A04

一月テーブル
コード  売上
------  ----
 A01     100

二月テーブル
コード  売上
------  ----
 A02     200

三月テーブル
コード  売上
------  ----
 A01     400
 A03     600

3か月間の総売上を求めて、総売上の降順に出力する。

出力結果
コード   総売上
------  ------
 A03      600
 A01      500
 A02      200
 A04        0


データ作成スクリプト

create Table 商品(コード char(3));

create Table 一月(
コード char(3),
売上   number(3));

create Table 二月 as select * from 一月;
create Table 三月 as select * from 一月;

insert into 商品(コード) values('A01');
insert into 商品(コード) values('A02');
insert into 商品(コード) values('A03');
insert into 商品(コード) values('A04');
insert into 一月(コード,売上) values('A01',100);
insert into 二月(コード,売上) values('A02',200);
insert into 三月(コード,売上) values('A01',400);
insert into 三月(コード,売上) values('A03',600);
commit;


SQL

--■■■相関サブクエリを使う方法■■■
select コード,
(select nvl(sum(b.売上),0) from
    (select c.コード,c.売上 from 一月 c
     union all select c.コード,c.売上 from 二月 c
     union all select c.コード,c.売上 from 三月 c) b
 where b.コード=a.コード) as 総売上
from 商品 a
order by 総売上 desc;

--■■■相関サブクエリを使う方法■■■
select コード,
nvl((select b.売上 from 一月 b where b.コード=a.コード),0) +
nvl((select b.売上 from 二月 b where b.コード=a.コード),0) +
nvl((select b.売上 from 三月 b where b.コード=a.コード),0) as 総売上
from 商品 a
order by 総売上 desc;

--■■■外部結合を使う方法■■■
select a.コード,
nvl(b.売上,0)+nvl(c.売上,0)+nvl(d.売上,0) as 総売上
from 商品 a,一月 b,二月 c,三月 d
where a.コード=b.コード(+)
  and a.コード=c.コード(+)
  and a.コード=d.コード(+)
order by 総売上 desc;


解説

unionで和集合を作成して、sum関数を使う方法や、
足し算で総合計を取得する方法があります。