1. ホーム
  2. Database

は、GROUP BY句に含まれるか、集約関数で使用される必要があります。

2022-02-11 05:57:44

今日、統計情報をグループ化する際、pgsqlがエラーを報告しました。 must appear in the GROUP BY clause or be used in an aggregate function これはpgsqlでよくある集計の問題で、SQL3標準以前では、表示用に選択されたフィールドは必ず GROUP BY で、その問題を以下に説明します。

というテーブルがあります。 makerar で、そのテーブルには以下のように記録されています。
cname|wmname|avg
--------|--------|-----------------------
カナダ|ゾロ|2.00
スペイン|ルフィ|1.00
スペイン|ユーソップ|5.00

をクエリしたいのですが cname の最大値 avg としてmysqlに書き込まれます。

SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;

pgsqlで報告されたエラー

ERROR: column "makerar.wmname" must appear in the GROUP BY clause or be used in an aggregate function 
LINE 1: SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;

意味 wmname フィールドは、必ず GROUP BY または、集計関数で使用される

そこで、エラーのプロンプトに従って wmname フィールドを GROUP BY に続いて

SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;

得られた結果は

<テーブル cname wmname アベック カナダ ゾロ 2.00 スペイン ルフィ 1.00 スペイン ユーソップ 5.00

そして、私が期待していた結果は

<テーブル cname wmname アベック カナダ ゾロ 2.00 スペイン ユーソップ 5.00

解決策は2つありますが、私は1つしか理解できなかったので、こちらを記録します。

一般的なアイデアは、サブクエリで集計を完了し、表示したいフィールドを含むテーブル(この場合はmakerar自身)を関連付け、フィールド(この場合はwmname)を取得することで、SQLは以下のようになります。

SELECT   
  t.cname,
  m.wmname,
  t.max
FROM 
  (SELECT 
    cname,
    MAX(avg) AS max 
  FROM makerar
  GROUP BY cname) t
LEFT JOIN makerar m ON t.cname = m.cname AND t.max = m.avg;

参考リンク

https://stackoverflow.com/questions/19601948/must-appear-in-the-group-by-clause-or-be-used-in-an-aggregate-function#

取得元:https://www.cnblogs.com/zxhyJack/p/9934259.html