Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

決算期で集計する場合は、決算月だけマイナスすればいい

3月決算の会社の場合、4月〜翌月3月までが1年という単位になる。これをCASE句でまとめるのはツライ。同じ年度であることさえわかればGroupByできる。

4月1日〜翌3月31日を1年としたいなら、現在の日付から3ヶ月マイナスすればやっていける。

2018年1月〜3月から3ヶ月引くと、2017年10月〜12月になるから、2017年。
2018年4月〜12月は、2018年1月〜9月になるから、2018年。
2019年1月〜3月は、2018年10月〜12月になるから、2018年。
2019年4月以降は・・・2019年!

12月決算以外は、決算月の数値だけNヶ月さかのぼるだけ良い。12月決算は1月1日〜12月31日だから、通常の年度でいいから別段なにもしなくてよい。

検証した

かんぺき。シカクいアタマをマルくしないと、生きていけない。

f:id:gothedistance:20190307172654p:plain

縦持ちの場合はこういうSQLになる

3月決算の場合です。3という固定値をプレースホルダーにすれば、どの決算月でもおk!

SELECT
	date_format(e.billdate, '%Y年%m月'),
	e.subtotal
FROM
	earnings AS e
GROUP BY
	YEAR(e.billdate - INTERVAL (3 % 12) MONTH),
	MONTH(e.billdate)
ORDER BY
	date_format(e.billdate,'%Y%m' )

横持ち(つまり、12ヶ月分のカラムを並べる)の場合は、CASE-WHENで頑張るしか無いな・・・

SELECT
	CASE
		WHEN MONTH(e.billdate) = 4 THEN e.subtotal
		ELSE 0
	END AS '4',
	CASE
		WHEN MONTH(e.billdate) = 5 THEN e.subtotal
		ELSE 0
	END AS '5',
	CASE
		WHEN MONTH(e.billdate) = 5 THEN e.subtotal
		ELSE 0
	END AS '6' -- 以下略
FROM
	earnings AS e
GROUP BY
	YEAR(e.billdate - INTERVAL (3 % 12) MONTH),
	MONTH(e.billdate)
ORDER BY
	date_format(e.billdate,'%Y%m' )

横持ちについては、縦で取得してPythonならPandasとか使ってそっちで集計して、画面に出すってのもありかも〜