Oracle Database を使用して SQL を実行した際に、
|
1 |
ORA-00979: GROUP BY の式ではありません。 |
というエラーが発生することがあります。
このエラーは GROUP BY 句の理解が不十分な場合に必ず遭遇する代表的なエラー であり、原因は明確です。
本記事では、
- ORA-00979 が発生する正確な条件
- なぜその SQL がエラーになるのか
- 正しい書き方と修正パターン
を、実務目線で丁寧に解説します。
ORA-00979 とは何か
ORA-00979 は、日本語メッセージのとおり、
SELECT 句に書かれている列が、GROUP BY 句に含まれていない
場合に発生するエラーです。
つまり Oracle は、
「集計しているのに、どの単位でまとめるのか分からない列が SELECT に含まれています」
と判断しています。
GROUP BY の基本ルール(重要)
まず、最重要ルールを明確にします。
ルール
SELECT 句に書く列は、次のいずれかでなければなりません。
- GROUP BY 句に指定されている列
- 集計関数(COUNT / SUM / AVG / MAX / MIN など)で包まれている列
このルールから外れると、必ず ORA-00979 が発生します。
よくあるエラー例①(最頻出)
誤った SQL
|
1 2 3 4 5 6 |
SELECT deptno, ename, COUNT(*) FROM emp GROUP BY deptno; |
なぜエラーになるのか
deptno→ GROUP BY に含まれている → 問題なしCOUNT(*)→ 集計関数 → 問題なしename→ GROUP BY にも集計関数にも含まれていない → エラー
Oracle は
「部門ごとに集計した結果なのに、どの社員名を表示すればよいのか分からない」
と判断します。
正しい書き方①:GROUP BY に列を追加する
|
1 2 3 4 5 6 |
SELECT deptno, ename, COUNT(*) FROM emp GROUP BY deptno, ename; |
この場合は、
- 部門番号 × 社員名 の単位で集計
という意味になります。
正しい書き方②:表示不要な列を削除する
|
1 2 3 4 5 |
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno; |
「部門ごとの人数」を求めたいだけであれば、これが正解です。
よくあるエラー例②:集計関数の理解不足
誤った SQL
|
1 2 3 4 5 |
SELECT deptno, sal FROM emp GROUP BY deptno; |
なぜエラーになるのか
sall は数値ですが、集計関数ではありません。
Oracle は「部門ごとに複数の給与が存在する」ため、どの値を表示すべきか判断できません。
正しい書き方③:集計関数を使用する
|
1 2 3 4 5 |
SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno; |
または、
|
1 2 3 4 5 |
SELECT deptno, MAX(sal) AS max_sal FROM emp GROUP BY deptno; |
よくあるエラー例③:式や関数を使った場合
誤った SQL
|
1 2 3 4 5 |
SELECT deptno, TO_CHAR(hiredate, 'YYYY') FROM emp GROUP BY deptno; |
なぜエラーになるのか
SELECT 句ではTO_CHAR(hiredate, 'YYYY')
という 式 を使っています。
しかし GROUP BY には deptno しかありません。
正しい書き方④:式そのものを GROUP BY に書く
|
1 2 3 4 5 |
SELECT deptno, TO_CHAR(hiredate, 'YYYY') FROM emp GROUP BY deptno, TO_CHAR(hiredate, 'YYYY'); |
GROUP BY では、SELECT と同じ式を完全一致で書く必要があります。
別名(AS)は GROUP BY では使えない
誤った SQL
|
1 2 3 4 5 |
SELECT deptno, TO_CHAR(hiredate, 'YYYY') AS hire_year FROM emp GROUP BY deptno, hire_year; |
なぜエラーになるのか
Oracle では、SELECT 句の別名は GROUP BY では使用できません。
正しい書き方
|
1 |
GROUP BY deptno, TO_CHAR(hiredate, 'YYYY'); |
HAVING 句との混同によるエラー
HAVING は GROUP BY 後の条件指定 です。
正しい例
|
1 2 3 4 5 6 |
SELECT deptno, COUNT(*) AS cnt FROM emp GROUP BY deptno HAVING COUNT(*) >= 5; |
HAVING 句に書けるのは、
- 集計関数
- GROUP BY に含まれる列
のみです。
ORA-00979 を防ぐチェックポイント
SQL を書いたら、次を必ず確認してください。
- SELECT にある列はすべて GROUP BY に含まれているか
- もしくは集計関数で包まれているか
- SELECT の式と GROUP BY の式は完全一致しているか
- 別名を GROUP BY に書いていないか
これを守れば、ORA-00979 は確実に回避できます。
まとめ
ORA-00979 は難しいエラーではありません。
原因は常に「SELECT と GROUP BY の不整合」だけです。
- 表示したい単位を明確にする
- 不要な列を SELECT に含めない
- 集計するなら集計関数を使う
この3点を意識すれば、実務で詰まることはなくなります。


