SQLで平均値を求めるには?AVG関数の基本から応用まで丁寧に解説

データベース・SQL

売上や成績などの「平均値」を知りたい時、SQLではどのように書けばよいのでしょうか?

そんな時に使うのがAVG(アベレージ)関数です。

この記事では、AVG関数の使い方を初心者向けにやさしく解説し、実務でも役立つ応用例や注意点を紹介します。

スポンサーリンク

AVG関数ってなに?

AVG関数の役割

AVG()は、指定した数値列の平均値を求めるSQL関数です。

数値型のデータに対してのみ使えます。

基本的な書き方

SELECT AVG(列名) FROM テーブル名;

実際の使用例

-- 学生テーブルから全体の平均点を取得
SELECT AVG(score) FROM students;

-- 商品テーブルから平均価格を取得
SELECT AVG(price) FROM products;

-- 従業員テーブルから平均給与を取得
SELECT AVG(salary) FROM employees;

結果のイメージ

AVG(score)
----------
85.4

ポイント

  • 数値のデータ型(INT、DECIMAL、FLOATなど)にのみ使用可能
  • 文字列や日付には使えない
  • 結果は小数点付きの数値で返される

よくある疑問

Q: 整数の列でも小数点が出るの?
A: はい。平均値は小数点付きで計算されるため、整数の列でも結果は小数になります。

基本の構文を押さえたら、次は条件付きで平均を求める方法を見ていきましょう。

WHERE句で条件付きの平均を求めよう

WHERE句との組み合わせ

特定の条件に合うデータのみで平均を求めたい場合は、WHERE句を使います。

実際の使用例

-- 成績がAの学生だけの平均点
SELECT AVG(score) FROM students WHERE grade = 'A';

-- 価格が1000円以上の商品の平均価格
SELECT AVG(price) FROM products WHERE price >= 1000;

-- 入社3年以上の従業員の平均給与
SELECT AVG(salary) FROM employees WHERE hire_date < '2022-01-01';

-- 東京都の店舗の平均売上
SELECT AVG(sales) FROM stores WHERE prefecture = '東京都';

複数条件での平均

-- 20代の男性社員の平均給与
SELECT AVG(salary) FROM employees 
WHERE age BETWEEN 20 AND 29 AND gender = '男性';

-- 評価4以上の商品の平均価格
SELECT AVG(price) FROM products 
WHERE rating >= 4 AND category = 'electronics';

ポイント

  • WHERE句で条件を絞ってから平均を計算
  • より具体的で意味のある分析ができる
  • 複数の条件を組み合わせることも可能

条件を指定することで、目的に合った平均値が取得できます。次は、カテゴリ別に平均を出す方法を紹介します。

GROUP BYでカテゴリ別に平均を出そう

GROUP BYとの組み合わせ

GROUP BY句を使うと、グループごとに平均を求められます。これにより、比較分析が可能になります。

実際の使用例

-- クラス別の平均点
SELECT class, AVG(score) FROM students GROUP BY class;

-- 部署別の平均給与
SELECT department, AVG(salary) FROM employees GROUP BY department;

-- カテゴリ別の平均価格
SELECT category, AVG(price) FROM products GROUP BY category;

-- 月別の平均売上
SELECT MONTH(sale_date), AVG(amount) FROM sales GROUP BY MONTH(sale_date);

結果のイメージ

class | AVG(score)
------|----------
A組    | 88.5
B組    | 82.3
C組    | 85.7

より詳しい分析例

-- 性別・年代別の平均給与
SELECT 
    gender, 
    CASE 
        WHEN age < 30 THEN '20代' 
        WHEN age < 40 THEN '30代' 
        ELSE '40代以上' 
    END AS age_group,
    AVG(salary) AS avg_salary
FROM employees 
GROUP BY gender, age_group;

ポイント

  • 各グループごとに1つの平均値が計算される
  • 複数の列でグループ化することも可能
  • 結果はグループ名と平均値のペアで表示される

集計を分けることで、比較や傾向の分析に役立ちます。次は、NULL値が含まれる場合の扱いを説明します。

NULL値の扱いに注意しよう

AVG関数とNULL値

AVG()はNULL値を自動で除外して計算します。つまり、NULLは0として扱われず、計算対象から外れます。

NULL値の扱い方

-- NULLを含むデータの例
-- score列: 80, 90, NULL, 70, NULL, 85

-- AVG関数は NULLを除外して計算
SELECT AVG(score) FROM students;
-- 結果: (80 + 90 + 70 + 85) / 4 = 81.25

-- 全データ数をカウント
SELECT COUNT(*) FROM students;
-- 結果: 6(NULLも含む)

-- NULL以外のデータ数をカウント
SELECT COUNT(score) FROM students;
-- 結果: 4(NULLを除外)

NULL値を0として扱いたい場合

-- COALESCE関数でNULLを0に変換してから平均を計算
SELECT AVG(COALESCE(score, 0)) FROM students;

-- CASE文を使った方法
SELECT AVG(CASE WHEN score IS NULL THEN 0 ELSE score END) FROM students;

全ての値がNULLの場合

-- 全ての値がNULLの場合、結果もNULLになる
SELECT AVG(score) FROM students WHERE score IS NULL;
-- 結果: NULL

NULL値の確認方法

-- NULL値がどれくらいあるかチェック
SELECT 
    COUNT(*) AS total_records,
    COUNT(score) AS non_null_scores,
    COUNT(*) - COUNT(score) AS null_scores
FROM students;

ポイント

  • NULL値は自動的に計算から除外される
  • NULL値を0として扱いたい場合は変換が必要
  • 全ての値がNULLの場合、結果もNULLになる

正確な集計には、NULL値の存在を前提にしておくことが大切です。次は他の関数と組み合わせた例を紹介します。

AVGと他の集計関数を組み合わせよう

複数の集計関数の併用

AVGCOUNT, SUM, MAX, MINなどの関数と一緒に使うことで、より多面的な分析が可能です。

実際の使用例

-- 部署別の詳細統計
SELECT 
    department,
    COUNT(*) AS 人数,
    AVG(salary) AS 平均給与,
    MAX(salary) AS 最高給与,
    MIN(salary) AS 最低給与,
    SUM(salary) AS 給与総額
FROM employees
GROUP BY department;

結果のイメージ

department | 人数 | 平均給与  | 最高給与  | 最低給与  | 給与総額
-----------|------|----------|----------|----------|----------
営業部      | 15   | 450000   | 600000   | 300000   | 6750000
開発部      | 20   | 520000   | 800000   | 350000   | 10400000

より高度な分析例

-- 売上データの月次分析
SELECT 
    YEAR(sale_date) AS 年,
    MONTH(sale_date) AS 月,
    COUNT(*) AS 取引件数,
    AVG(amount) AS 平均売上,
    SUM(amount) AS 月間売上,
    ROUND(AVG(amount), 0) AS 平均売上_整数
FROM sales
GROUP BY YEAR(sale_date), MONTH(sale_date)
ORDER BY 年, 月;

条件付きの集計

-- 商品カテゴリ別の評価分析
SELECT 
    category,
    COUNT(*) AS 商品数,
    AVG(price) AS 平均価格,
    AVG(rating) AS 平均評価,
    COUNT(CASE WHEN rating >= 4 THEN 1 END) AS 高評価商品数
FROM products
GROUP BY category
HAVING AVG(rating) >= 3.5;  -- 平均評価が3.5以上のカテゴリのみ

小数点の調整

-- 平均値を小数点以下2桁に丸める
SELECT 
    class,
    ROUND(AVG(score), 2) AS 平均点
FROM students
GROUP BY class;

-- 平均値を整数に切り上げ
SELECT 
    department,
    CEIL(AVG(salary)) AS 平均給与_切り上げ
FROM employees
GROUP BY department;

ポイント

  • 複数の集計関数を組み合わせて包括的な分析
  • ROUND関数で小数点を調整可能
  • HAVING句で集計結果に条件を設定

複数の集計関数を使いこなせば、SQLだけで高度なデータ分析ができます。

まとめ

SQLのAVG関数は、数値の平均値を求めるための基本的かつ重要なツールです。

覚えるべきポイント

  • 基本構文SELECT AVG(列名) FROM テーブル名
  • WHERE句との組み合わせ:条件を絞って平均を計算
  • GROUP BYとの組み合わせ:カテゴリ別の平均を算出
  • NULL値の扱い:自動的に除外されて計算される

実務での活用場面

  • 売上分析:月別・地域別の平均売上
  • 人事データ:部署別・年代別の平均給与
  • 商品分析:カテゴリ別の平均価格・平均評価
  • 学習データ:科目別・クラス別の平均成績

よくある活用パターン

  • 全体の傾向把握
  • グループ間の比較分析
  • パフォーマンス指標の算出
  • 異常値の検出(平均から大きく外れる値)

コメント

タイトルとURLをコピーしました