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

9-40 2つの合計を求める

SQLパズル

Budgetedテーブル
task  category  est_cost
----  --------  --------
   1      9100       100
   2      9100        15
   3      9100         6
   4      9200         8
   5      9200        11

Actualテーブル
voucher  task  act_cost
-------  ----  --------
      1     1        10
      2     1        20
      3     1        15
      4     2        32
      5     4         8
      6     5         3
      7     5         4

Budgetedテーブルのcategoryごとの、
est_costの合計と、
taskに紐づく、act_costの合計を出力する

出力結果
category  est_cost  act_cost
--------  --------  --------
    9100       121        77
    9200        19        15

SQLパズル(日本語版)のパズル47 [予算と実績] を参考にさせていただきました
SQLパズル 第2版のパズル51 [予算と実支出の対比] を参考にさせていただきました


データ作成スクリプト

create table Budgeted(
task     number(1) primary key,
category number(4) not null,
est_cost number(3) not null);

insert into Budgeted values(1,9100,100);
insert into Budgeted values(2,9100, 15);
insert into Budgeted values(3,9100,  6);
insert into Budgeted values(4,9200,  8);
insert into Budgeted values(5,9200, 11);

create table Actual(
voucher  number(1) primary key,
task     number(1) not null references Budgeted(task),
act_cost number(2) not null);

insert into Actual values(1,1,10);
insert into Actual values(2,1,20);
insert into Actual values(3,1,15);
insert into Actual values(4,2,32);
insert into Actual values(5,4, 8);
insert into Actual values(6,5, 3);
insert into Actual values(7,5, 4);
commit;


SQL

select category,sum(a.est_cost) as est_cost,
sum(b.act_cost) as act_cost
from Budgeted a
Left Join (select task,sum(act_cost) as act_cost
             from Actual
           group by task) b
  on a.task = b.task
group by category
order by category;


解説

インラインビューで、集計して、
外部結合させてます