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)
次のテーブルを作成します。
| 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
結果は次の通り
| 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
同じ結果セットで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 |