試しにSQLを作ってみました。
create table STAFF
(ID smallint,
名前 varchar(10));
create table LABOR
(ID smallint,
社員ID smallint,
年月日 date,
時間数 smallint,
プロジェクトID smallint);
insert into STAFF values(101,'川口');
insert into STAFF values(111,'宮本');
insert into STAFF values(123,'中田英');
insert into LABOR(社員ID,年月日,時間数) values(101,'2006-01-05',8);
insert into LABOR(社員ID,年月日,時間数) values(101,'2006-02-01',10);
insert into LABOR(社員ID,年月日,時間数) values(101,'2006-02-15',5);
insert into LABOR(社員ID,年月日,時間数) values(101,'2006-03-01',8);
insert into LABOR(社員ID,年月日,時間数) values(101,'2006-03-03',10);
insert into LABOR(社員ID,年月日,時間数) values(101,'2006-03-10',12);
insert into LABOR(社員ID,年月日,時間数) values(111,'2006-01-10',5);
insert into LABOR(社員ID,年月日,時間数) values(111,'2006-01-15',10);
insert into LABOR(社員ID,年月日,時間数) values(111,'2006-01-31',5);
insert into LABOR(社員ID,年月日,時間数) values(111,'2006-02-10',8);
insert into LABOR(社員ID,年月日,時間数) values(111,'2006-02-20',8);
insert into LABOR(社員ID,年月日,時間数) values(111,'2006-03-20',10);
insert into LABOR(社員ID,年月日,時間数) values(123,'2006-01-20',8);
insert into LABOR(社員ID,年月日,時間数) values(123,'2006-01-21',8);
insert into LABOR(社員ID,年月日,時間数) values(123,'2006-01-22',8);
insert into LABOR(社員ID,年月日,時間数) values(123,'2006-03-03',5);
insert into LABOR(社員ID,年月日,時間数) values(123,'2006-03-04',5);
insert into LABOR(社員ID,年月日,時間数) values(123,'2006-03-05',5);
select
x.名前,
coalesce(sum(case when date_part('month',年月日)=1 then 時間数 end),0) as 1月,
coalesce(sum(case when date_part('month',年月日)=2 then 時間数 end),0) as 2月,
coalesce(sum(case when date_part('month',年月日)=3 then 時間数 end),0) as 3月,
coalesce(sum(case when date_part('month',年月日) between 1 and 3 then 時間数 end),0) as 合計
from STAFF as x,LABOR as y
where x.ID=y.社員ID
group by x.名前
order by x.名前
;
お礼
chukenkenkou様 ありがとうございました! まったく知らなかったSQLです。 勉強になります。 早速、こちらを参考につくってみます。 *なお「宮本」が何故か「川口」と名寄せされて、一緒に集計されてしまうのですが…。 英語名に変えてみたら、正しく集計されました。 1月 2月 3月 合計 川口 28 31 40 99 中田英 24 0 15 39
補足
名寄せされてしまう理由は分かりませんでしたが、 STAFFの一意識別子(ID)でGROUPすれば、正しく集計されました。 どうもありがとうございました!