トップページに戻る
次の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関数を使う方法や、
足し算で総合計を取得する方法があります。