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

5-32 指定月と指定期間で集計

SQLパズル


テーブルA
部門  年月     金額A
----  ------   -----
AAA   200404    10
AAA   200405     5
AAA   200406    15
AAA   200409    25
AAA   200412    30
CCC   200406     5

テーブルB
部門  年月     金額B
----  ------   -----
AAA   200404       5
AAA   200404      10
AAA   200405      20
AAA   200406      15
AAA   200409      40
AAA   200410       5
AAA   200501      60
BBB   200404      20

テーブルA、Bから
以下の結果を出力する(集計対象がない場合は、NULLを出力)

出力結果
部門   2004/04(金額A)  2004/04(金額B)   2004/04〜2004/09(金額A)   2004/04〜2004/09(金額B)
----   -------------  --------------   -----------------------  ------------------------
AAA              10              15                        55                        90
BBB            NULL              20                      NULL                        20
CCC            NULL            NULL                         5                      NULL


データ作成スクリプト

create Table テーブルA(
部門  char(3),
年月  char(6),
金額A number(2));

create Table テーブルB(
部門  char(3),
年月  char(6),
金額B number(2));

insert into テーブルA(部門,年月,金額A) values('AAA','200404',10);
insert into テーブルA(部門,年月,金額A) values('AAA','200405', 5);
insert into テーブルA(部門,年月,金額A) values('AAA','200406',15);
insert into テーブルA(部門,年月,金額A) values('AAA','200409',25);
insert into テーブルA(部門,年月,金額A) values('AAA','200412',30);
insert into テーブルA(部門,年月,金額A) values('CCC','200406', 5);
insert into テーブルB(部門,年月,金額B) values('AAA','200404', 5);
insert into テーブルB(部門,年月,金額B) values('AAA','200404',10);
insert into テーブルB(部門,年月,金額B) values('AAA','200405',20);
insert into テーブルB(部門,年月,金額B) values('AAA','200406',15);
insert into テーブルB(部門,年月,金額B) values('AAA','200409',40);
insert into テーブルB(部門,年月,金額B) values('AAA','200410', 5);
insert into テーブルB(部門,年月,金額B) values('AAA','200501',60);
insert into テーブルB(部門,年月,金額B) values('BBB','200404',20);
commit;


SQL

--■■■相関サブクエリを使う方法■■■
select a.部門,
(select sum(b.金額A) from テーブルA b
 where b.部門 = a.部門
   and b.年月='200404') as "2004/04(金額A)",
(select sum(b.金額B) from テーブルB b
  where b.部門 = a.部門
    and b.年月='200404') as "2004/04(金額B)",
(select sum(b.金額A) from テーブルA b
  where b.部門 = a.部門
    and b.年月 between '200404' and '200409') as "2004/04〜2004/09(金額A)",
(select sum(b.金額B) from テーブルB b
  where b.部門 = a.部門
    and b.年月 between '200404' and '200409') as "2004/04〜2004/09(金額B)"
from (select 部門 from テーブルA
      union select 部門 from テーブルB) a
order by 部門;

--■■■sum関数とdecode関数とcase式を使う方法■■■
select 部門,
sum(decode(年月,'200404',金額A)) as "2004/04(金額A)",
sum(decode(年月,'200404',金額B)) as "2004/04(金額B)",
sum(case when 年月 between '200404' and '200409' then 金額A end) as "2004/04〜2004/09(金額A)",
sum(case when 年月 between '200404' and '200409' then 金額B end) as "2004/04〜2004/09(金額B)"
from (select 部門,年月,金額A,null as 金額B from テーブルA
      union all
      select 部門,年月,null,金額B from テーブルB)
group by 部門
order by 部門;


解説

相関サブクエリを使う方法では、
インラインビューで、unionを使用して、部門の一覧を持つ集合を作成して
select句でスカラー問い合わせで、合計を求めてます。