PR

【SQL】SUM(CASE WHEN)を使った条件付き集計

SQL

SQLのSUM関数で、集計する条件の指定方法を調べたのでメモしておきます。

集計条件の指定方法

書き方は以下の通りです。

SELECT
    SUM(CASE WHEN flag = 1 THEN 1 ELSE 0 END)
FROM
    table名

SUM関数の中で CASE文を使うことで、条件に一致するデータだけを集計することが出来ます。

サンプル

売上テーブルを作って、プロジェクトごとの売上額と、当月時点の売上を集計するサンプルです。

CREATE TABLE `売上` (
  `id`                int            NOT NULL AUTO_INCREMENT,
  `プロジェクトID`    varchar(3)     NOT NULL,
  `計上年月日`        date           NOT NULL,
  `金額`              decimal(11,2)  NOT NULL,
  PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

データを用意します。

  • プロジェクト001は、1月〜6月まで毎月100,000円を売上
  • プロジェクト002は、3月〜4月まで毎月50,000円を売上
INSERT INTO `売上` VALUES (1, '001', '2022-01-31', 100000);
INSERT INTO `売上` VALUES (2, '001', '2022-02-28', 100000);
INSERT INTO `売上` VALUES (3, '001', '2022-03-31', 100000);
INSERT INTO `売上` VALUES (4, '001', '2022-04-30', 100000);
INSERT INTO `売上` VALUES (5, '001', '2022-05-31', 100000);
INSERT INTO `売上` VALUES (6, '001', '2022-06-30', 100000);
INSERT INTO `売上` VALUES (7, '002', '2022-03-31', 50000);
INSERT INTO `売上` VALUES (8, '002', '2022-04-30', 50000);

プロジェクトごとの売上額と、4月末までの売上を集計してみます。

売上額は単純にSUM(金額)で集計します。

当月時点の売上は、計上月が4月までの金額を合計したいので、SUM(CASE WHEN)を使って集計条件を指定します。

SELECT
    `プロジェクトID`,
    SUM(`金額`) AS `売上額`,
    SUM(CASE WHEN `計上年月日` <= '2022-04-30' THEN `金額` ELSE 0 END) AS `4月時点売上`
FROM `売上`
GROUP BY `プロジェクトID`;

SQLを実行すると、次のような結果になります。

プロジェクトID    売上額      4月時点売上
001               600000          400000
002               100000          100000

コメント

タイトルとURLをコピーしました