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

10-38 曜日ごとの集計

SQLパズル

売上管理テーブル
商品コード   販売日   数量
---------  --------  ----
      001  20050115     3
      001  20050116     5
      001  20050117     8
      001  20050118     3
      001  20050119     7
      001  20050120     3
      001  20050121    21
      001  20050122     7
      001  20050123     4
      001  20050124     8
      002  20050115     4
      002  20050116     6
      002  20050117    76
      002  20050118     3
      002  20050119     7
      002  20050120     3
      002  20050121     4
      002  20050122     7
      002  20050123     7
      002  20050124     3

日付(月曜とは限らない)を引数として受け取り、
販売数量を以下の形式で出力する。

出力結果 (2005/01/20を引数として受け取った場合)
商品コード  MON  TUE  WED  THU  FRI  SAT  SUN
----------  ---  ---  ---  ---  ---  ---  ---
001           8    3    7    3   21    7    4
002          76    3    7    3    4    7    7


データ作成スクリプト

create table 売上管理(
商品コード char(3),
販売日     char(8),
数量       number(3));

insert into 売上管理 values('001','20050115', 3);
insert into 売上管理 values('001','20050116', 5);
insert into 売上管理 values('001','20050117', 8);
insert into 売上管理 values('001','20050118', 3);
insert into 売上管理 values('001','20050119', 7);
insert into 売上管理 values('001','20050120', 3);
insert into 売上管理 values('001','20050121',21);
insert into 売上管理 values('001','20050122', 7);
insert into 売上管理 values('001','20050123', 4);
insert into 売上管理 values('001','20050124', 8);
insert into 売上管理 values('002','20050115', 4);
insert into 売上管理 values('002','20050116', 6);
insert into 売上管理 values('002','20050117',76);
insert into 売上管理 values('002','20050118', 3);
insert into 売上管理 values('002','20050119', 7);
insert into 売上管理 values('002','20050120', 3);
insert into 売上管理 values('002','20050121', 4);
insert into 売上管理 values('002','20050122', 7);
insert into 売上管理 values('002','20050123', 7);
insert into 売上管理 values('002','20050124', 3);
commit;


SQL

col MON for 99
col TUE for 99
col WED for 99
col THU for 99
col FRI for 99
col SAT for 99
col SUN for 99

select 商品コード,
sum(decode(to_char(to_date(販売日,'yyyymmdd'),'D'),'2',数量,0)) as MON,
sum(decode(to_char(to_date(販売日,'yyyymmdd'),'D'),'3',数量,0)) as TUE,
sum(decode(to_char(to_date(販売日,'yyyymmdd'),'D'),'4',数量,0)) as WED,
sum(decode(to_char(to_date(販売日,'yyyymmdd'),'D'),'5',数量,0)) as THU,
sum(decode(to_char(to_date(販売日,'yyyymmdd'),'D'),'6',数量,0)) as FRI,
sum(decode(to_char(to_date(販売日,'yyyymmdd'),'D'),'7',数量,0)) as SAT,
sum(decode(to_char(to_date(販売日,'yyyymmdd'),'D'),'1',数量,0)) as SUN
from 売上管理
where 販売日 between next_day(to_date('20050120','yyyymmdd'),'月')-7
                 and next_day(to_date('20050120','yyyymmdd'),'月')-1
group by 商品コード
order by 商品コード;


解説

between演算子とnext_day関数を組み合わせて、
販売日を範囲指定してます。

2005年カレンダー