ORA-00979 : GROUP BYの式ではありません。 の原因と正しい書き方

  • URLをコピーしました!

Oracle Database を使用して SQL を実行した際に、

というエラーが発生することがあります。
このエラーは GROUP BY 句の理解が不十分な場合に必ず遭遇する代表的なエラー であり、原因は明確です。

本記事では、

  • ORA-00979 が発生する正確な条件
  • なぜその SQL がエラーになるのか
  • 正しい書き方と修正パターン
    を、実務目線で丁寧に解説します。

目次

ORA-00979 とは何か

ORA-00979 は、日本語メッセージのとおり、

SELECT 句に書かれている列が、GROUP BY 句に含まれていない

場合に発生するエラーです。

つまり Oracle は、

「集計しているのに、どの単位でまとめるのか分からない列が SELECT に含まれています」

と判断しています。


GROUP BY の基本ルール(重要)

まず、最重要ルールを明確にします。

ルール

SELECT 句に書く列は、次のいずれかでなければなりません。

  1. GROUP BY 句に指定されている列
  2. 集計関数(COUNT / SUM / AVG / MAX / MIN など)で包まれている列

このルールから外れると、必ず ORA-00979 が発生します。


よくあるエラー例①(最頻出)

誤った SQL

なぜエラーになるのか

  • deptno → GROUP BY に含まれている → 問題なし
  • COUNT(*) → 集計関数 → 問題なし
  • ename → GROUP BY にも集計関数にも含まれていない → エラー

Oracle は
「部門ごとに集計した結果なのに、どの社員名を表示すればよいのか分からない」
と判断します。


正しい書き方①:GROUP BY に列を追加する

この場合は、

  • 部門番号 × 社員名 の単位で集計

という意味になります。


正しい書き方②:表示不要な列を削除する

「部門ごとの人数」を求めたいだけであれば、これが正解です。


よくあるエラー例②:集計関数の理解不足

誤った SQL

なぜエラーになるのか

sall は数値ですが、集計関数ではありません
Oracle は「部門ごとに複数の給与が存在する」ため、どの値を表示すべきか判断できません。


正しい書き方③:集計関数を使用する

または、


よくあるエラー例③:式や関数を使った場合

誤った SQL

なぜエラーになるのか

SELECT 句では
TO_CHAR(hiredate, 'YYYY')
という を使っています。

しかし GROUP BY には deptno しかありません。


正しい書き方④:式そのものを GROUP BY に書く

GROUP BY では、SELECT と同じ式を完全一致で書く必要があります。


別名(AS)は GROUP BY では使えない

誤った SQL

なぜエラーになるのか

Oracle では、SELECT 句の別名は GROUP BY では使用できません

正しい書き方


HAVING 句との混同によるエラー

HAVING は GROUP BY 後の条件指定 です。

正しい例

HAVING 句に書けるのは、

  • 集計関数
  • GROUP BY に含まれる列

のみです。


ORA-00979 を防ぐチェックポイント

SQL を書いたら、次を必ず確認してください。

  • SELECT にある列はすべて GROUP BY に含まれているか
  • もしくは集計関数で包まれているか
  • SELECT の式と GROUP BY の式は完全一致しているか
  • 別名を GROUP BY に書いていないか

これを守れば、ORA-00979 は確実に回避できます。


まとめ

ORA-00979 は難しいエラーではありません。
原因は常に「SELECT と GROUP BY の不整合」だけです。

  • 表示したい単位を明確にする
  • 不要な列を SELECT に含めない
  • 集計するなら集計関数を使う

この3点を意識すれば、実務で詰まることはなくなります。

よかったらシェアしてね!
  • URLをコピーしました!
0 0
Article Rating
申し込む
注目する
guest
0 コメント一覧
最も古い
最新 高評価
インラインフィードバック
すべてのコメントを見る
目次
0
あなたの考えが大好きです、コメントしてください。x