以下のような単純なテーブルを、
グループ毎(商品名と年月)に集計し、
その集計結果へ「合計」列を追加することが出来ます!
集計結果へ「合計」列を追加するために、この記事では以下を
使用します!
・ROLLUP句
・GROUPING関数
ROLLUP句、GROUPING関数とは
どちらも標準SQLに含まれているモノです。
よってSQL Serverを含む全てのRDBMSで使用可能です。
これらを使用することで、グループ毎の集計結果へ「合計」列を追加することができます。
準備
以下のSQLを実行し、テーブルの作成/データの登録をします。
--テーブルの作成
CREATE TABLE sales
(
id CHAR(3) PRIMARY KEY,
productName VARCHAR(16),
price INTEGER NOT NULL,
saleDate DATE NOT NULL,
)
--データの登録
INSERT INTO sales VALUES('001','すいか','10','2020-01-01')
INSERT INTO sales VALUES('002','すいか','20','2020-01-02')
INSERT INTO sales VALUES('003','すいか','30','2020-01-03')
INSERT INTO sales VALUES('004','めろん','40','2020-01-04')
INSERT INTO sales VALUES('005','めろん','50','2020-01-05')
INSERT INTO sales VALUES('006','めろん','60','2020-01-06')
INSERT INTO sales VALUES('007','すいか','70','2020-02-01')
INSERT INTO sales VALUES('008','すいか','80','2020-02-02')
INSERT INTO sales VALUES('009','すいか','90','2020-02-03')
INSERT INTO sales VALUES('010','めろん','100','2020-02-04')
INSERT INTO sales VALUES('011','めろん','110','2020-02-05')
INSERT INTO sales VALUES('012','すいか','120','2021-01-01')
INSERT INTO sales VALUES('013','すいか','130','2021-01-02')
INSERT INTO sales VALUES('014','めろん','140','2021-01-03')
INSERT INTO sales VALUES('015','めろん','150','2021-01-04')
SQLと実行結果
ここでは
・商品毎と年月毎でグルーピングし売上を集計
・集計結果へ「合計」列を追加
します。
SELECT
CASE
WHEN GROUPING(productName) = 1 THEN FORMAT(saleDate,'yyyy/MM') + '年の合計' ELSE productName
END AS '商品名/合計',
CASE
WHEN GROUPING(productName) = 1 THEN '-' ELSE FORMAT(saleDate,'yyyy/MM')
END AS '年月',
sum(price) AS '売上合計'
FROM sales
GROUP BY
ROLLUP(productName),
FORMAT(saleDate,'yyyy/MM')
ORDER BY
FORMAT(saleDate,'yyyy/MM'),
productName
結果の確認
「合計」列が追加されたことを確認します。