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日だから、通常の年度でいいから別段なにもしなくてよい。
検証した
かんぺき。シカクいアタマをマルくしないと、生きていけない。
縦持ちの場合はこういう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とか使ってそっちで集計して、画面に出すってのもありかも〜