適当に勉強してるログです。GROUP BY WITH ROLLUP
っていう構文知らなかったので試す。
雑にデータベース起動。
1 | docker run --rm -p 13306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql --secure-file-priv='' |
データベース作成して、テーブル作成して、テストデータ投入。
1 | CREATE |
1. 地域ごとの合計を表示
1 | SELECT region, SUM(amount) AS total_amount |
なるほど、合計がでてる。 region
が NULL ってのが若干気になるけど便利。
1 | +--------+--------------+ |
2. 地域・商品ごとの合計+小計・総計を表示
1 | SELECT region, product, SUM(amount) AS total_amount |
NULL〜〜〜ってのは置いといて、小計と総計もでる。しかもクエリ一発。なるほど
1 | +--------+---------+--------------+ |
結果の見方のヒント
NULLが特別な意味を持つようになるが、クエリの数は減ってる。この辺り、現場によって判断が分かれそう。
- product が NULL → その region の小計
- region と product が NULL → 全体の総計
NULLを見やすくする工夫
こんな感じでNULLを処理してあげると見やすくなる。
1 | SELECT |
1 | +--------------+---------------+--------------+ |
まとめ
一回のクエリで総計がでるのは便利。とはいえ、NULLに特別な意味をもたせるので、判断が発生する余地はあるので若干気になる。きっと、帳票出力とかCSV出力とかBIツールのデータ出力だとマジで役立つのだろうと思った。
MySQL8で、これが使えるようするためにGRUOP BY周りは書き直しが発生していたらしく、GROUP BY周りの互換性のない変更なんかは、こういうのの影響らしい
https://dev.mysql.com/doc/refman/8.0/ja/upgrading-from-previous-series.html#upgrade-sql-changes
@soudai1025 が教えてくれた。あの人、MySQL詳しいな…