質問: mariadb10.4.7で下記の様な処理を行いたいです。 在庫管理テーブルがあり、商品の入出庫に応じてデータを登録しています。 在庫テーブルは下記の様な感じです。 ``` |date|varchar|varchara|float| 入出庫日|倉庫|商品|在庫数| 20190101|001|A01|1000| 20190101|001|A01|-300| . . . ``` 上記の様なデータが、荷動きの数分入っています。 今回実装したいのは下記の様なビューです。 ``` 倉庫or商品|1月在庫数 |2月在庫数 |3月在庫数 |......|12月在庫数 | keyが入る |1月時点の在庫|2月時点の在庫|3月時点の在庫|......|12月時点の在庫| . . . ``` 上記の様に月ごとの商品や倉庫別の在庫の推移をクロス集計表の様に出したいと考えています。 色々ためしてみたのですが、思った通りの結果が出ません。 できたら、アプリケーション側でクロス集計するのではなく、SQLでviewが作れる方が良いです。 どうか、お力をお貸しいただけると助かります。 下記のSQLを流すと一月単位で集計は出来るのですが、月ごとの推移を出したいので、累計?していくSQLが分からない状態です。 ``` SELECT a.倉庫コード AS '集計キー', SUM(if (date_format(a.入出庫日, '%Y%m')='201901', a.在庫数, 0)) AS '1月', SUM(if (date_format(a.入出庫日, '%Y%m')='201902', a.在庫数, 0)) AS '2月', SUM(if (date_format(a.入出庫日, '%Y%m')='201903', a.在庫数, 0)) AS '3月', SUM(if (date_format(a.入出庫日, '%Y%m')='201904', a.在庫数, 0)) AS '4月', SUM(if (date_format(a.入出庫日, '%Y%m')='201905', a.在庫数, 0)) AS '5月', SUM(if (date_format(a.入出庫日, '%Y%m')='201906', a.在庫数, 0)) AS '6月', SUM(if (date_format(a.入出庫日, '%Y%m')='201907', a.在庫数, 0)) AS '7月', SUM(if (date_format(a.入出庫日, '%Y%m')='201908', a.在庫数, 0)) AS '8月', SUM(if (date_format(a.入出庫日, '%Y%m')='201909', a.在庫数, 0)) AS '9月', SUM(if (date_format(a.入出庫日, '%Y%m')='201910', a.在庫数, 0)) AS '10月', SUM(if (date_format(a.入出庫日, '%Y%m')='201911', a.在庫数, 0)) AS '11月', SUM(if (date_format(a.入出庫日, '%Y%m')='201912', a.在庫数, 0)) AS '12月' FROM 在庫テーブル AS a GROUP BY a.倉庫コード ``` 上記は倉庫で絞っていますが、商品でも同様の事を行いたいです。 倉庫、商品はvarchara型で入出庫日はdate型になります。 宜しくお願いします。
回答: 論理的には、というレベルで。 「累計?」というのは、1月は1月分のSUM、2月は1~2月分のSUM...という意味で宜しいですか? これで良いのであれば、 入出庫日の条件を「当年の1月1日0時0分 <= 入出庫日 < 翌月の1日0時0分」 としては如何ですか?date_formatを使う必要は無いかと思います。 情報が種々不足していますので、速度などは度外視です。