MySQL8.0でGROUPING演算子について調べてみた
MySQL8.0でGROUPING演算子について(ROLLUP,CUBE,GROUPING SETS)
はじめに
GROUPING演算子は3種類ある。 これらについてまとめる。
- ROLLUP
- CUBE
- GROUPING SETS
使用するテーブル情報
テーブル作成
CREATE TABLE docker
.shohin
(id
serial,category
text,created_at
datetime, price
int , PRIMARY KEY (id));
データ挿入
INSERT INTO shohin
(category
, created_at
,price
) VALUES ('まんが' , '2021-09-21 00:00:00',100);
INSERT INTO shohin
(category
, created_at
,price
) VALUES ('まんが' , '2021-09-21 00:00:00',200);
INSERT INTO shohin
(category
, created_at
,price
) VALUES ('まんが' , '2021-09-21 00:00:00',300);
INSERT INTO shohin
(category
, created_at
,price
) VALUES ('雑誌' , '2021-09-21 00:00:00',400);
INSERT INTO shohin
(category
, created_at
,price
) VALUES ('雑誌' , '2021-09-21 00:00:00',500);
INSERT INTO shohin
(category
, created_at
,price
) VALUES ('新聞' , '2021-09-21 00:00:00',600);
INSERT INTO shohin
(category
, created_at
,price
) VALUES ('新聞' , '2021-09-21 00:00:00',700);
id | category | created_at | price |
---|---|---|---|
1 | まんが | 2021-09-21 00:00:00 | 100 |
2 | まんが | 2021-09-21 00:00:00 | 200 |
3 | まんが | 2021-09-21 00:00:00 | 300 |
4 | 雑誌 | 2021-09-21 00:00:00 | 400 |
5 | 雑誌 | 2021-09-21 00:00:00 | 500 |
6 | 新聞 | 2021-09-21 00:00:00 | 600 |
7 | 新聞 | 2021-09-21 00:00:00 | 700 |
ROLLUP
SELECT category , SUM(price) AS '合計'
FROM shohin
GROUP BY category WITH ROLLUP
ORDER BY category
;
category | 合計 |
---|---|
2800 | |
まんが | 600 |
新聞 | 1300 |
雑誌 | 900 |
categoryごとの合計と全体の合計が出力されています。
CUBE
MySQLでは使用できませんが、サンプルだけ記載しておきます。 生成される結果としては、ROLLUPに似ていますが、クロス集計の行を追加することになります。
SELECT category , SUM(price) AS '合計'
FROM shohin
GROUP BY CUBE(category,created_at)
ORDER BY category,created_at
;
GROUPING SETS
こちらもMySQLでは使用できません。サンプル記載しておきます。 生成される結果としては、categoryとcreated_atごとの合計値が出力されます。
SELECT category,created_at,SUM(price) AS '合計'
FROM shohin
group by
grouping sets(
(category),
(created_at)
)
おわりに
実務で使用することはあまりないかもしれませんが、 存在すら知らなかったので、良い機会になりました。
Discussion