【SQLエラー徹底解説】ORA-00979「not a GROUP BY expression」の原因と解決策
SQLエラー ORA-00979 "not a GROUP BY expression" の詳細解説
ORA-00979 は、Oracleデータベースで発生するSQLエラーです。このエラーは、SELECT句で選択された列とGROUP BY句で指定された列に不一致がある場合に発生します。
原因
このエラーが発生する主な原因は2つあります。
GROUP BY句に含まれていない列がSELECT句に選択されている
例:
SELECT 部門名, 社員名 FROM 社員 GROUP BY 部門名;
この例では、
社員名
列はGROUP BY句
に含まれていないため、エラーが発生します。SELECT 部門名, COUNT(*) FROM 社員 GROUP BY 部門名;
この例では、
COUNT(*)
関数で処理されていない部門名
列がSELECT句
に選択されています。この場合、部門名
列をGROUP BY句
に追加するか、COUNT(*)
関数で処理する必要があります。
解決策
このエラーを解決するには、以下のいずれかの方法を実行する必要があります。
問題のある列をGROUP BY句に追加する
SELECT 部門名, 社員名 FROM 社員 GROUP BY 部門名, 社員名;
問題のある列を集計関数で処理する
SELECT 部門名, COUNT(DISTINCT 社員名) FROM 社員 GROUP BY 部門名;
問題のある列を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