🦁
【SQL】日別の表に集計行を入れる
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