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 テーブルid | date | products | price |
1 | 2024-08-12 | ぺんぎんクッキー | 380 |
2 | 2024-08-12 | らくだキャラメル | 80 |
3 | 2024-08-19 | ぺんぎんクッキー | 160 |
4 | 2024-08-19 | しろくまアイス | 220 |
5 | 2024-08-19 | らくだキャラメル | 140 |
6 | 2024-08-26 | ぺんぎんクッキー | 580 |
7 | 2024-08-26 | らくだキャラメル | 120 |
8 | 2024-08-26 | ぺんぎんクッキー | 640 |
9 | 2024-09-02 | しろくまアイス | 380 |
10 | 2024-09-02 | らくだキャラメル | 540 |
11 | 2024-09-09 | ぺんぎんクッキー | 200 |
12 | 2024-09-09 | しろくまアイス | 180 |
13 | 2024-09-09 | しろくまアイス | 360 |
14 | 2024-09-16 | ぺんぎんクッキー | 420 |
15 | 2024-09-16 | らくだキャラメル | 95 |
16 | 2024-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
実行結果
実行すると以下の結果となります。
products | sum08 | sum09 |
しろくまアイス | 220 | 920 |
ぺんぎんクッキー | 1760 | 620 |
らくだキャラメル | 340 | 815 |
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
以下の結果となります。
products | sum08 | sum09 | diff0809 |
しろくまアイス | 220 | 920 | -700 |
ぺんぎんクッキー | 1760 | 620 | 1140 |
らくだキャラメル | 340 | 815 | -475 |
このページのキーワード
- SUM関数で合計する条件を指定する ・条件に一致したレコードのフィールド値の合計を取得する
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。