言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. SQL辞典
  3. SUM / AVG

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』テーブルを例に説明します。

employees id name department salary bonus 1 孫悟空 亀仙流 300000 50000 2 ベジータ カプセルコーポレーション 280000 NULL 3 ブルマ カプセルコーポレーション 320000 40000 4 クリリン 亀仙流 260000 NULL 4 rows in set

全社員の給与合計と平均を取得します。

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』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。