🦁

【SQL】日別の表に集計行を入れる

2020/10/26に公開

1日1行の表に、1週間ごとの集計行を入れる方法

select date_, num

--  date_    | num
-- 10/1(mon) | 5
-- 10/2(tue) | 3
-- 10/7(sun) | 2
-- 10/8(mon) | 8

ここに月曜~日曜の1週間ごとに集計行を入れます

まず週番号を入れる

select week(date_, 1) as `week`, date_

-- week | date_
--  31  | 10/1(mon)
--  31  | 10/2(tue)
--  31  | 10/7(sun)
--  32  | 10/8(mon)

week(date_, 1)で月曜始まりのときの週番号が取れます。
第二引数で月曜始まりか日曜始まりか、などいろいろ設定できます。

週番号でまとめる

select week(date_, 1) as `week`, date_, num
group by week, date_ with rollup

-- week |  date_   | num
--  31  | 10/1(mon)| 5
--  31  | 10/2(tue)| 3
--  31  | 10/7(sun)| 2
--  31  |   null   | 10
--  32  | 10/8(mon)| 8
--  32  |   null   | 8
-- null |   null   | 18

with rollupで集計行を入れることができます。
これで週ごと、全体の集計行を入れることができます。

集計行をわかりやすくする

select
	week(date_, 1) as `week`,
	case when date_ is null then '計' else date_ end as `date`,
	num
group by week, date_ with rollup

-- week |    date   | num
--  31  |  10/1(mon)| 5
--  31  |  10/2(tue)| 3
--  31  |  10/7(sun)| 2
--  31  |  計       | 10
--  32  |  10/8(mon)| 8
--  32  |  計     | 8
-- null |   null    | 18

集計行は値にnullが入るので、
case whenを使って"計"等の文字列を入れるようにすると、見やすくなります。

Discussion