データ分析やレポート作成で必須となる Oracle Database の集計関数。本記事では基本となる SUM, AVG, MAX, MIN, COUNT の5つの使い方を解説します。NULLの扱いや GROUP BY との組み合わせなど、初心者が陥りやすい注意点も scott スキーマの実例で確実に学びましょう。
なお、本記事ではSCOTTサンプルスキーマを使用した例で解説します。
SCOTTサンプルスキーマは以下を実行することでインポートおよび使用が可能です。
$ sqlplus / as sysdba
SQL> @?/rdbms/admin/utlsampl.sql
$ sqlplus scott/tiger
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
集計関数の結論・クイックリファレンス
集計関数(グループ関数)は、複数の行をまとめて「1つの結果」を返す機能です。まずは機能と特徴を一覧で押さえましょう。
| 関数名 | 機能 | NULLの扱い | 対象データ型 |
| SUM | 合計値を計算 | 無視する | 数値 |
| AVG | 平均値を計算 | 無視する | 数値 |
| MAX | 最大値を取得 | 無視する | 数値, 文字, 日付 |
| MIN | 最小値を取得 | 無視する | 数値, 文字, 日付 |
| COUNT | 行数・個数を数える | *は含む / 列指定は無視 | 全て |
【この記事でわかること】
- 5大集計関数の正しい書き方と実行結果
COUNT(*)とCOUNT(列名)の決定的な違い- よくあるエラー(ORA-00937)の解決法
1. 背景と基礎:集計関数の仕組み
通常の SQL(SELECT * FROM ...)は1行のデータをそのまま表示しますが、集計関数は縦方向(列)のデータを計算して1行に圧縮します。
用語の定義
- 集計関数 (Aggregate Function): 入力として複数の行を受け取り、単一の値を返す関数。
- GROUP BY 句: データを特定の条件(部署ごと、職種ごとなど)でグループ化するために使用します。
- NULL の考慮: 基本的に集計関数は NULL を「存在しないもの」として無視して計算します(
COUNT(*)を除く)。
2. 実行環境と事前準備
本手順は以下の環境を想定しています。
- OS: Oracle Linux 7/8 (Windows版でもSQL構文は共通)
- DB: Oracle Database 19c (Standard / Enterprise)
- ユーザー: scott スキーマ(または同等の権限を持つユーザー)
- 対象データ: EMP テーブル(従業員マスタ)
対象テーブルの確認
まずは実験台となるデータを確認します。
-- 前提: SQL*Plus または SQL Developer で接続済み
SELECT EMPNO, ENAME, JOB, SAL, COMM, DEPTNO FROM EMP ORDER BY DEPTNO;
実行結果:
SQL> SELECT EMPNO, ENAME, JOB, SAL, COMM, DEPTNO FROM EMP ORDER BY DEPTNO;
EMPNO ENAME JOB SAL COMM DEPTNO
---------- ---------- ---------- ---------- ---------- ----------
7839 KING PRESIDENT 5000 10
7782 CLARK MANAGER 2450 10
7934 MILLER CLERK 1300 10
7902 FORD ANALYST 3000 20
7369 SMITH CLERK 800 20
7566 JONES MANAGER 2975 20
7900 JAMES CLERK 950 30
7844 TURNER SALESMAN 1500 0 30
7654 MARTIN SALESMAN 1250 1400 30
7521 WARD SALESMAN 1250 500 30
7499 ALLEN SALESMAN 1600 300 30
7698 BLAKE MANAGER 2850 30
12行が選択されました。
10部門や20部門などの部署コード(DEPTNO)や、給与(SAL)、歩合給(COMM)が含まれています。COMM には NULL が含まれている点に注目してください。
3. 実践:集計関数の使用手順
ここからは実際の SQL を実行しながら各関数の挙動を確認します。
手順1: SUM関数(合計)とAVG関数(平均)
数値データの合計と平均を算出します。AVG は割り切れない数値になることが多いため、実務では ROUND(四捨五入)と組み合わせるのが鉄則です。
-- 部署(DEPTNO)ごとの給与合計と平均給与を取得
SELECT
DEPTNO,
SUM(SAL) AS TOTAL_SALARY,
ROUND(AVG(SAL), 1) AS AVG_SALARY_R
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO;
実行結果:
SQL> SELECT
2 DEPTNO,
3 SUM(SAL) AS TOTAL_SALARY,
4 ROUND(AVG(SAL), 1) AS AVG_SALARY_R
5 FROM EMP
6 GROUP BY DEPTNO
7 ORDER BY DEPTNO;
DEPTNO TOTAL_SALARY AVG_SALARY_R
---------- ------------ ------------
10 8750 2916.7
20 6775 2258.3
30 9400 1566.7
解説:
SUM(SAL): SAL列の値を単純加算します。AVG(SAL): SAL列の合計 ÷ 行数 で計算します。NULL の行は分母(行数)に含まれません。GROUP BY DEPTNO: 部署番号ごとに集計単位を区切っています。
手順2: MAX関数(最大)とMIN関数(最小)
数値だけでなく、日付(最新/最古)や文字列(辞書順)にも使用可能です。
-- 部署ごとの最高給与と最低給与を取得
SELECT
DEPTNO,
MAX(SAL) AS MAX_SALARY,
MIN(SAL) AS MIN_SALARY
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO;
実行結果:
SQL> SELECT
2 DEPTNO,
3 MAX(SAL) AS MAX_SALARY,
4 MIN(SAL) AS MIN_SALARY
5 FROM EMP
6 GROUP BY DEPTNO
7 ORDER BY DEPTNO;
DEPTNO MAX_SALARY MIN_SALARY
---------- ---------- ----------
10 5000 1300
20 3000 800
30 2850 950
解説:
- 給与のレンジ(幅)を知るのに役立ちます。
- 日付列に対して
MAX(HIREDATE)を実行すれば、「最も最近入社した日」が取得できます。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
手順3: COUNT関数(件数)の落とし穴
COUNT は「何を数えるか」によって結果が変わります。これが最大のハマりポイントです。
| 構文 | 意味 | 結果の違い |
COUNT(*) | 行そのものを数える | NULLを含む全行数が返る |
COUNT(列名) | 値が入っている行を数える | NULLの行は数えない |
-- 部署ごとの「所属人数」と「歩合(COMM)をもらっている人数」を比較
SELECT
DEPTNO,
COUNT(*) AS MEMBER_COUNT, -- 所属している全人数
COUNT(COMM) AS COMM_HOLDER -- COMMがNULLでない人数
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO;
実行結果:
SQL> SELECT
2 DEPTNO,
3 COUNT(*) AS MEMBER_COUNT,
4 COUNT(COMM) AS COMM_HOLDER
5 FROM EMP
6 GROUP BY DEPTNO
7 ORDER BY DEPTNO;
DEPTNO MEMBER_COUNT COMM_HOLDER
---------- ------------ -----------
10 3 0
20 3 0
30 6 4
実行結果の例(30部門):
MEMBER_COUNT: 6人(部署にいる全員)COMM_HOLDER: 4人(COMMがNULLの2人はカウントされない)
4. 応用:すべての集計関数を組み合わせる
実務でよく使う「部署別統計レポート」を作成する SQL です。コピー&ペーストして動作を確認してください。
-- 部署別統計レポート作成用SQL
SELECT
DEPTNO,
COUNT(*) AS "従業員数",
SUM(SAL) AS "給与合計",
ROUND(AVG(SAL), 0) AS "平均給与",
MAX(SAL) AS "最高給与",
MIN(SAL) AS "最低給与"
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO;
実行結果:
SQL> SELECT
2 DEPTNO,
3 COUNT(*) AS "従業員数",
4 SUM(SAL) AS "給与合計",
5 ROUND(AVG(SAL), 0) AS "平均給与",
6 MAX(SAL) AS "最高給与",
7 MIN(SAL) AS "最低給与"
8 FROM EMP
9 GROUP BY DEPTNO
10 ORDER BY DEPTNO;
DEPTNO 従業員数 給与合計 平均給与 最高給与 最低給与
---------- ---------- ---------- ---------- ---------- ----------
10 3 8750 2917 5000 1300
20 3 6775 2258 3000 800
30 6 9400 1567 2850 950
5. トラブルシューティング
集計関数使用時によく発生するエラーとその対処法です。
| エラーコード | エラーメッセージ | 原因と対処 |
| ORA-00937 | 単一グループのグループ関数ではありません | SELECT句に集計関数と「集計していない列(生データ)」が混在しています。対処: 集計していない列をすべて GROUP BY に追加してください。 |
| ORA-00979 | GROUP BYの式ではありません | GROUP BY で指定していない列を SELECT しようとしています。対処: SELECT リストにある列は、必ず GROUP BY に含めるか、集計関数を通す必要があります。 |
| ORA-01476 | 除数がゼロです | 平均計算などで分母が0になる場合(手動計算時など)。 対処: DECODE や NULLIF で0除算を回避します。 |
6. 運用・監視・セキュリティ上の注意
影響範囲とリスク
- パフォーマンス: 大量の行(数千万件〜)を集計する場合、フルスキャンが発生し DB サーバーの CPU/IO が高騰するリスクがあります。
- 戻し方(キャンセル): 実行時間が長すぎる場合は、SQL*Plus なら
Ctrl + C、ツールなら「キャンセル」ボタンでクエリを中断してください。データの変更(UPDATE/DELETE)は伴わないため、データ破損のリスクはありません。
ベストプラクティス
- 可能な限り
WHERE句で事前にデータを絞り込んでから集計してください。 GROUP BYする列にはインデックスを作成することを検討してください(ソート処理の負荷軽減)。
7. FAQ:よくある質問
Q1. 集計結果に対して「平均2000以上」のような条件で絞り込みたいです。
A. WHERE 句ではなく HAVING 句 を使用します。
WHERE は集計「前」の絞り込み、HAVING は集計「後」の絞り込みです。
例: SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) >= 2000;
Q2. NULL を 0 とみなして平均を計算したい場合は?
A. NVL 関数を使用して NULL を 0 に変換してから集計します。
例: AVG(NVL(COMM, 0))
これにより、分母(行数)に NULL の行も含まれるようになり、正しい「全体平均」が算出できます。
Q3. Oracle SQL で中央値(Median)は出せますか?
A. はい、MEDIAN 関数が使用可能です(10g以降)。平均値は外れ値(極端に高い給与など)の影響を受けやすいため、実態把握には中央値が適している場合があります。
まとめ
- 基本の5つ: SUM(合計)、AVG(平均)、MAX(最大)、MIN(最小)、COUNT(数)を暗記する。
- NULLの罠:
COUNT(*)は NULL を含むが、COUNT(列)やSUM/AVGは NULL を無視する。 - グループ化: 集計しない列を表示する場合は、必ず
GROUP BYに含める(ORA-00937対策)。 - パフォーマンス: 不要な行は
WHEREで先に除外してから集計する。
集計関数は SQL の基礎にして奥義です。まずは手元の環境で COUNT の挙動の違いから試してみてください。
本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。
[参考]
Oracle Database SQL言語リファレンス 19c
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント