目次

SUM関数で合計する条件を指定する ・条件に一致したレコードのフィールド値の合計を求める - SQL

SQLで条件に一致したレコードのフィールド値の合計を求める方法、SUM関数で合計する条件を指定するSQL文を紹介します。

概要

GROUP BYを利用して種類ごとの集計をする際に、別のフィールドの値に応じて条件つけて合計を集計したい場合があります。 この記事では、SUM関数で合計する際に条件を指定する記述方法を紹介します。

方針

SUM関数のCASE WHEN THEN ELSE END 文を利用すると、SUM関数で条件を指摘できます。

書式

次の書式を利用します。
SUM(CASE WHEN [条件式] THEN [値またはフィールド] ELSE [値またはフィールド] END)

ELSEは省略できるため、以下の書式も利用可能です。
SUM(CASE WHEN [条件式] THEN [値またはフィールド] END)

次のテーブルを作成します。
Sales テーブル
iddateproductsprice
12024-08-12ぺんぎんクッキー380
22024-08-12らくだキャラメル80
32024-08-19ぺんぎんクッキー160
42024-08-19しろくまアイス220
52024-08-19らくだキャラメル140
62024-08-26ぺんぎんクッキー580
72024-08-26らくだキャラメル120
82024-08-26ぺんぎんクッキー640
92024-09-02しろくまアイス380
102024-09-02らくだキャラメル540
112024-09-09ぺんぎんクッキー200
122024-09-09しろくまアイス180
132024-09-09しろくまアイス360
142024-09-16ぺんぎんクッキー420
152024-09-16らくだキャラメル95
162024-09-16らくだキャラメル180

GROUP BY を利用してそれぞれの商品のpriceの合計を求めます。
SELECT products, SUM(price) FROM Sales GROUP BY products

結果は次の通り
Sales テーブル
products (列名なし)
しろくまアイス 1140
ぺんぎんクッキー 2380
らくだキャラメル 1155

ここで、SUMの合計値を2024年の8月分と9月分で分けて求めたいとします。別々の結果であれば、次のSQLで求められます。
しかし、できれば同じ結果セットで出力したい場合も多々あります。
SELECT products, SUM(price) FROM Sales WHERE '2024-08-01' <= date and date < '2024-09-01' GROUP BY products
SELECT products, SUM(price) FROM Sales WHERE '2024-09-01' <= date and date < '2024-10-01'GROUP BY products

SQL文

同じ結果セットで8月分と9月分の合計を表示したい場合に、SUM関数内で条件設定できるとよいです。
次のSQL文を作成して実行します。
SELECT products, 
  SUM(CASE WHEN '2024-08-01' <= date and date < '2024-09-01' THEN price END) as sum08,
  SUM(CASE WHEN '2024-09-01' <= date and date < '2024-10-01' THEN price END) as sum09
  FROM Sales GROUP BY products

解説

以下のSQL文で、8月分のpriceの合計を求めています。dateの値が8月であれば、合計を求めて、sum08列に結果を出力します。GROUP BY が指定されているため、producsごとの合計になります。
  SUM(CASE WHEN '2024-08-01' <= date and date < '2024-09-01' THEN price END) as sum08

同様に9月分のpriceの合計を求め、sum09列に結果を出力します。
  SUM(CASE WHEN '2024-09-01' <= date and date < '2024-10-01' THEN price END) as sum09

実行結果

実行すると以下の結果となります。
productssum08sum09
しろくまアイス220920
ぺんぎんクッキー1760620
らくだキャラメル340815

SUM関数で条件を指定して合計値を出すことができました。

補足

1つの結果セットで出力したい用途の多くでは、それぞれの差を求めたいことがあります。次のSQLで差を出力することもできます。
SELECT products, 
  SUM(CASE WHEN '2024-08-01' <= date and date < '2024-09-01' THEN price END) as sum08,
  SUM(CASE WHEN '2024-09-01' <= date and date < '2024-10-01' THEN price END) as sum09,
  SUM(CASE WHEN '2024-08-01' <= date and date < '2024-09-01' THEN price END)
    - SUM(CASE WHEN '2024-09-01' <= date and date < '2024-10-01' THEN price END) as diff0809
  FROM Sales GROUP BY products

以下の結果となります。
productssum08sum09diff0809
しろくまアイス220920-700
ぺんぎんクッキー17606201140
らくだキャラメル340815-475
このページのキーワード
  • SUM関数で合計する条件を指定する ・条件に一致したレコードのフィールド値の合計を取得する
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
掲載日: 2023-12-09
iPentec all rights reserverd.