【SQLエラー徹底解説】ORA-00979「not a GROUP BY expression」の原因と解決策

2024-06-12

SQLエラー ORA-00979 "not a GROUP BY expression" の詳細解説

ORA-00979 は、Oracleデータベースで発生するSQLエラーです。このエラーは、SELECT句で選択された列GROUP BY句で指定された列に不一致がある場合に発生します。

原因

このエラーが発生する主な原因は2つあります。

  1. GROUP BY句に含まれていない列がSELECT句に選択されている

    例:

    SELECT 部門名, 社員名
    FROM 社員
    GROUP BY 部門名;
    

    この例では、社員名列はGROUP BY句に含まれていないため、エラーが発生します。

  2. SELECT 部門名, COUNT(*)
    FROM 社員
    GROUP BY 部門名;
    

    この例では、COUNT(*)関数で処理されていない部門名列がSELECT句に選択されています。この場合、部門名列をGROUP BY句に追加するか、COUNT(*)関数で処理する必要があります。

解決策

このエラーを解決するには、以下のいずれかの方法を実行する必要があります。

  1. 問題のある列をGROUP BY句に追加する

    SELECT 部門名, 社員名
    FROM 社員
    GROUP BY 部門名, 社員名;
    
  2. 問題のある列を集計関数で処理する

    SELECT 部門名, COUNT(DISTINCT 社員名)
    FROM 社員
    GROUP BY 部門名;
    
  3. 問題のある列をSELECT句から削除する

補足

  • 複数の列をグループ化する場合、すべての列をGROUP BY句に含める必要があります。
  • 集計関数で処理されていない列は、SELECT句から削除するか、GROUP BY句に追加する必要があります。
  • エラーメッセージには、問題のある列に関する情報が含まれている場合があります。この情報を使用して、問題を特定し、解決することができます。



    -- エラーが発生するコード
    SELECT 部門名, 社員名
    FROM 社員
    GROUP BY 部門名;
    

    修正コード

    -- エラーを修正したコード
    SELECT 部門名, 社員名
    FROM 社員
    GROUP BY 部門名, 社員名;
    
    -- エラーが発生するコード
    SELECT 部門名, COUNT(*)
    FROM 社員
    GROUP BY 部門名;
    
    -- エラーを修正したコード
    SELECT 部門名, COUNT(DISTINCT 社員名)
    FROM 社員
    GROUP BY 部門名;
    
    -- エラーが発生するコード
    SELECT 部門名, 社員名
    FROM 社員
    GROUP BY 部門名;
    
    -- エラーを修正したコード
    SELECT 部門名
    FROM 社員
    GROUP BY 部門名;
    
    • 上記のコードはあくまで例であり、実際の状況に合わせて変更する必要があります。
    • エラーメッセージをよく読んで、問題のある列を特定してください。



    ORA-00979エラーを解決するその他の方法

    サブクエリを使用して、集計前に必要な列をグループ化することができます。例:

    SELECT 部門名, COUNT(*)
    FROM 社員
    GROUP BY 部門名;
    

    このエラーを修正するには、次のようにサブクエリを使用できます。

    SELECT 部門名, COUNT(*)
    FROM (
      SELECT 部門名, 社員名
      FROM 社員
    ) AS tmp
    GROUP BY 部門名;
    

    CASE式を使用して、問題のある列を条件付きでグループ化することができます。例:

    SELECT 部門名, COUNT(*)
    FROM 社員
    GROUP BY 部門名;
    
    SELECT 部門名, COUNT(*)
    FROM 社員
    GROUP BY CASE
      WHEN 社員名 IS NULL THEN 'NULL'
      ELSE 社員名
      END;
    

    集計関数の引数に式を使用することで、問題のある列をグループ化することができます。例:

    SELECT 部門名, COUNT(*)
    FROM 社員
    GROUP BY 部門名;
    
    SELECT 部門名, COUNT(DISTINCT SUBSTRING(社員名, 1, 1))
    FROM 社員
    GROUP BY 部門名;
    
    SELECT 部門名, COUNT(*)
    FROM 社員
    GROUP BY 部門名;
    
    SELECT 部門名, COUNT(*) OVER (PARTITION BY 部門名)
    FROM 社員;
    

    注意事項

    • 上記の方法は、すべての状況で適用できるわけではありません。
    • 使用する方法は、クエリの要件とデータベースのバージョンによって異なります。
    • 複雑なクエリの場合は、最適な解決策を見つけるために、データベース管理者に相談することをお勧めします。

    sql oracle ora-00979


    SQL初心者でも安心!「SQL error: misuse of aggregate」を画像付きで分かりやすく解説

    このエラーを解決するには、以下の点を確認する必要があります。集計関数が正しい列に使用されているかどうか確認する: 集計関数は、数値列または日付列に対してのみ使用できます。文字列列に対して集計関数を使用すると、このエラーが発生します。WHERE句で条件を指定しているかどうか確認する: 集計関数は、WHERE句で条件を指定して使用できます。WHERE句を指定しないと、すべての行がグループ化され、エラーが発生する可能性があります。...


    MySQLのストレージエンジンを最適化:MyISAMからInnoDBへの移行

    MySQLのストレージエンジンには、MyISAMとInnoDBの2種類があります。それぞれ異なる特徴を持ち、用途によって使い分けられます。MyISAM: 高速な読み書きが可能な一方で、トランザクションやデータ整合性に弱いです。InnoDB: トランザクションやデータ整合性に強い一方で、MyISAMよりも読み書き速度が遅くなります。...


    SQLでPostgreSQLテーブルを丸ごとコピーする方法:初心者でも安心!

    方法1:CREATE TABLE + INSERT を使用するこの方法は、テーブルの構造とデータをコピーする最もシンプルな方法です。以下の手順で行います。コピー先のテーブルを作成するこのコマンドは、元_テーブルの構造をコピーした空のテーブルコピー先_テーブルを作成します。...


    【SQL初心者向け】SQLiteで床関数(FLOOR)を使って小数点以下の部分を切り捨てて整数を取得する方法

    FLOOR関数を使用するFLOOR関数は、引数として渡された数値の小数点以下の部分を切り捨て、最も近い整数を返します。これが最も一般的でシンプルな方法です。例:CAST関数と負のゼロを使用するCAST関数を使用して、数値を別のデータ型に変換することもできます。床値を取得するには、数値をINTEGER型にキャストし、負のゼロを使用します。負のゼロは、小数点以下の部分を切り捨てます。...


    SQLにおけるデータ分析をマスターするための必須スキル:2つのSELECTステートメント結果の結合

    SQLにおいて、複数のSELECTステートメントの結果を結合することは、様々なデータ分析やレポート作成において重要です。結合には、主に以下の3種類があります。INNER JOIN: 一致する行のみを結合します。最も一般的な結合方法です。LEFT JOIN: 左側のテーブルのすべての行と、右側のテーブルで一致する行を結合します。右側テーブルで一致しない行は、NULL値として扱われます。...