Column must appear in GROUP BY clause or aggregate function
SQLでGROUP BY句にカラムが含まれていない場合のエラー
概要
Column must appear in the GROUP BY clause or be used in an aggregate function は、GROUP BYを使用する際に、SELECT句のカラムがGROUP BY句に含まれていないか、集計関数で囲まれていない場合に発生するエラーです。
エラーメッセージ
PostgreSQL:
ERROR: column "table.column" must appear in the GROUP BY clause or be used in an aggregate function
MySQL (ONLY_FULL_GROUP_BY):
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column
SQL Server:
Column 'table.column' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
原因
| |
GROUP BYで集約すると、各グループに複数の行が存在する可能性があります。その中からどの name を選べばよいか不明なため、エラーになります。
解決策
1. GROUP BY句にカラムを追加
| |
2. 集計関数を使用
| |
3. SELECT句からカラムを削除
| |
4. サブクエリを使用
| |
5. ウィンドウ関数を使用
| |
MySQLの特殊な挙動
ONLY_FULL_GROUP_BY モード
| |
| |
ANY_VALUE関数(MySQL 5.7+)
| |
よくあるパターン
最新のレコードを取得
| |
集計と詳細の同時取得
| |
集計関数一覧
| 関数 | 説明 |
|---|---|
| COUNT(*) | 行数をカウント |
| COUNT(column) | NULLでない値をカウント |
| SUM(column) | 合計 |
| AVG(column) | 平均 |
| MAX(column) | 最大値 |
| MIN(column) | 最小値 |
| STRING_AGG(column, delimiter) | 文字列連結(PostgreSQL) |
| GROUP_CONCAT(column) | 文字列連結(MySQL) |
| ARRAY_AGG(column) | 配列に集約(PostgreSQL) |
関連エラー
関連エラー
SQL の他のエラー
この記事は役に立ちましたか?