SUM / AVG
| 対応: | SQL-92(1992) |
|---|
数値列の合計値と平均値を求める集計関数です。GROUP BYと組み合わせてグループごとの集計にも使用します。
構文
列の合計値を取得します。
SELECT SUM(列名) FROM テーブル名;
列の平均値を取得します。
SELECT AVG(列名) FROM テーブル名;
重複を除いた値の合計・平均を取得します。
SELECT SUM(DISTINCT 列名), AVG(DISTINCT 列名) FROM テーブル名;
グループごとの合計・平均を取得します。
SELECT グループ列, SUM(列名), AVG(列名) FROM テーブル名 GROUP BY グループ列;
構文一覧
| 構文 | 概要 |
|---|---|
| SUM(列名) | 指定した列の合計値を返します。NULL値は無視されます。 |
| AVG(列名) | 指定した列の平均値を返します。NULL値は分子にも分母にも含まれません。 |
| SUM(DISTINCT 列名) | 重複した値を除いた合計を返します。 |
| AVG(DISTINCT 列名) | 重複した値を除いた平均を返します。 |
サンプルコード
以下の『employees』テーブルを例に説明します。
全社員の給与合計と平均を取得します。
sample_sum_avg.sql
SELECT SUM(salary) AS 給与合計, AVG(salary) AS 平均給与 FROM employees;
+----------+------------+ | 給与合計 | 平均給与 | +----------+------------+ | 1160000 | 290000.000 | +----------+------------+ 1 row in set
部署ごとの給与合計と平均を取得します。
sample_sum_avg.sql
SELECT department, SUM(salary) AS 給与合計, AVG(salary) AS 平均給与 FROM employees GROUP BY department ORDER BY 給与合計 DESC;
+--------------------------+----------+------------+ | department | 給与合計 | 平均給与 | +--------------------------+----------+------------+ | カプセルコーポレーション | 600000 | 300000.000 | | 亀仙流 | 560000 | 280000.000 | +--------------------------+----------+------------+ 2 rows in set
平均給与を小数点以下2桁で丸めます。
sample_sum_avg.sql
SELECT ROUND(AVG(salary), 2) AS 平均給与 FROM employees;
+-----------+ | 平均給与 | +-----------+ | 290000.00 | +-----------+ 1 row in set
ボーナスの合計を取得します。NULLを0として計算したい場合は『IFNULL』を使用します。
sample_sum_avg.sql
SELECT SUM(IFNULL(bonus, 0)) AS ボーナス合計 FROM employees;
+--------------+ | ボーナス合計 | +--------------+ | 90000 | +--------------+ 1 row in set
ボーナスの支給対象者数と支給対象外の人数を取得します。
sample_sum_avg.sql
SELECT
SUM(CASE WHEN bonus IS NOT NULL THEN 1 ELSE 0 END) AS 支給あり,
SUM(CASE WHEN bonus IS NULL THEN 1 ELSE 0 END) AS 支給なし
FROM employees;
+----------+----------+ | 支給あり | 支給なし | +----------+----------+ | 2 | 2 | +----------+----------+ 1 row in set
データベース別の書き方
『SUM』『AVG』の基本構文は主要なデータベースで共通して使用できます。
SELECT department, SUM(salary) AS 給与合計, AVG(salary) AS 平均給与 FROM employees GROUP BY department;
NULLを0として扱いたい場合の関数名がデータベースによって異なります。MySQL は『IFNULL』、PostgreSQL・SQLite は『COALESCE』を使用します(『COALESCE』はMySQL でも使用可能です)。
-- MySQL SELECT SUM(IFNULL(bonus, 0)) AS ボーナス合計 FROM employees;
-- PostgreSQL・SQLite(MySQLでも使用可) SELECT SUM(COALESCE(bonus, 0)) AS ボーナス合計 FROM employees;
概要
『SUM』と『AVG』はどちらもNULL値を自動的に無視して計算します。ただし、NULLを0として合計に含めたい場合は『IFNULL(列名, 0)』または『COALESCE(列名, 0)』で明示的に変換する必要があります。
対象行が1件もない場合(WHERE条件に一致する行がない場合)、『SUM』はNULLを返し、『AVG』もNULLを返します。NULL対策として『IFNULL(SUM(列名), 0)』のように記述することで、安全に0を返すことができます。
最大値・最小値を求める場合は『MAX / MIN』を、グループごとの集計条件は『GROUP BY / HAVING』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。