Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

SUM / AVG

数値列の合計値と平均値を求める集計関数です。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 列名)重複した値を除いた平均を返します。
サンプルコード
-- 全社員の給与合計と平均を取得します。
SELECT SUM(salary) AS 給与合計, AVG(salary) AS 平均給与 FROM employees;

-- 部署ごとの給与合計と平均を取得します。
SELECT department, SUM(salary) AS 給与合計, AVG(salary) AS 平均給与
FROM employees
GROUP BY department
ORDER BY 給与合計 DESC;

-- 平均給与を小数点以下2桁で丸めます。
SELECT ROUND(AVG(salary), 2) AS 平均給与 FROM employees;

-- ボーナスの合計(NULLを0として計算したい場合はIFNULLを使用)。
SELECT SUM(IFNULL(bonus, 0)) AS ボーナス合計 FROM employees;

-- 商品の売上合計を取得します。
SELECT SUM(price * quantity) AS 売上合計 FROM order_items;
実行結果
-- SELECT department, SUM(salary) AS 給与合計, AVG(salary) AS 平均給与
-- FROM employees GROUP BY department ORDER BY 給与合計 DESC; の結果例
-- +----------+----------+------------+
-- | department | 給与合計  | 平均給与   |
-- +----------+----------+------------+
-- | 開発部   |  2400000 | 300000.000 |
-- | 営業部   |  1680000 | 280000.000 |
-- | 総務部   |   900000 | 300000.000 |
-- +----------+----------+------------+
データベース別の書き方

『SUM』『AVG』の基本構文は主要なデータベースで共通して使用できます。

SELECT department, SUM(salary) AS 給与合計, AVG(salary) AS 平均給与
FROM employees
GROUP BY department;

NULLを0として扱いたい場合の関数名がデータベースによって異なります。MySQL は『IFNULL』、PostgreSQL・Oracle・SQL Server・SQLite は『COALESCE』を使用します(『COALESCE』はMySQL でも使用可能です)。

-- MySQL
SELECT SUM(IFNULL(bonus, 0)) AS ボーナス合計 FROM employees;

-- PostgreSQL・Oracle・SQL Server・SQLite(MySQLでも使用可)
SELECT SUM(COALESCE(bonus, 0)) AS ボーナス合計 FROM employees;

小数点の丸めは MySQL・PostgreSQL・SQLite が『ROUND(値, 桁数)』、Oracle は『ROUND(値, 桁数)』(同じ構文)、SQL Server は『ROUND(値, 桁数)』で共通して使用できます。

概要

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

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