はじめに
- 実務においてとても使い勝手がよかったSQLがあったのでメモ。集約関数とCASE文を組み合わせて、異なる条件の集約を1つのSQLで行う
実行環境
- ブラウザ上で手軽に使えるDB実行環境:DB Fiddleを使用
SQLサンプル
サンプル:異なるタイプの集計結果を1つのSQLで行う
テーブル:商品在庫テーブル(MySQL8.0)
CREATE TABLE `shohinStock` (
`id` int NOT NULL AUTO_INCREMENT,
`type` int NOT NULL comment '1: 商品A, 2: 商品B',
`stockNum` int default 0,
PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert
INSERT INTO shohinStock VALUES(1, 1, 100);
INSERT INTO shohinStock VALUES(2, 1, 200);
INSERT INTO shohinStock VALUES(3, 2, 150);
INSERT INTO shohinStock VALUES(4, 1, 200);
INSERT INTO shohinStock VALUES(5, 2, 300);
INSERT INTO shohinStock VALUES(6, 1, 100);
INSERT INTO shohinStock VALUES(7, 1, 200);
INSERT INTO shohinStock VALUES(8, 2, 200);
INSERT INTO shohinStock VALUES(9, 1, 50);
type別にstockNum
(在庫数)を求めようとした場合、WHERE句でやるとなると、typeごとに集約する必要がある
Where句でtype毎に絞り込み&集約
SELECT
CASE WHEN type = 1 THEN '商品A' WHEN type = 2 THEN '商品B' ELSE 0 END AS '商品分類',
SUM(stockNum) AS '在庫総数'
FROM
shohinStock
WHERE
type = 1;
SELECT
CASE WHEN type = 1 THEN '商品A' WHEN type = 2 THEN '商品B' ELSE 0 END AS '商品分類',
SUM(stockNum) AS '在庫総数'
FROM
shohinStock
WHERE
type = 2;
SUMとCASE文を使って1つのSQLで表現してみる
SUM + CASE
SELECT
SUM(CASE WHEN type = 1 THEN stockNum ELSE 0 END) AS '商品A:在庫総数',
SUM(CASE WHEN type = 2 THEN stockNum ELSE 0 END) AS '商品B:在庫総数'
FROM
shohinStock;
参考文献
この記事は以下の情報を参考にして執筆しました。