0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SUMと CASE文を使って異なる条件の集計を行う ~ SUM(CASE WHEN) ~

Posted at

はじめに

  • 実務においてとても使い勝手がよかった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;

image.png

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;

image.png

参考文献

この記事は以下の情報を参考にして執筆しました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?