SQL エラーの解決: 「列は GROUP BY 句に指定するか、集計関数として使用する必要があります」
SQL クエリで、選択フィールドが GROUP BY
句に含まれておらず、集計操作も実行されない場合、「列 'wmname' は GROUP BY 句に表示されるか、集計関数として使用される必要があります。」エラー メッセージが表示されます。 。
具体的には、対応する国のマネージャー名 (wmname) を返しながら、各国 (cname) の最大平均 (avg) を見つけようとしています。ただし、wmname は GROUP BY
句に含まれておらず、集計関数でも使用されていません。
考えられる解決策:
この問題を解決するにはいくつかの方法があります:
方法 1: サブクエリと結合を使用する
この方法では、各国の最大平均を計算するサブクエリを作成し、その結果を元のテーブルと結合して国の管理者の名前を含めます。
<code class="language-sql">SELECT m.cname, m.wmname, t.mx FROM ( SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname ) t JOIN makerar m ON m.cname = t.cname AND t.mx = m.avg;</code>
方法 2: ウィンドウ関数を使用する
ウィンドウ関数は、サブクエリを使用せずにこの結果を取得する方法を提供します。
<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar;</code>
方法 3: DISTINCT と ROW_NUMBER() を使用する
より明示的なアプローチは、DISTINCT
を使用して一意の結果を保証し、ROW_NUMBER()
を使用して国ごとの平均が最も高い行のみを選択することです。
<code class="language-sql">SELECT DISTINCT /* distinct here matters, because maybe there are various tuples for the same max value */ m.cname, m.wmname, t.avg AS mx FROM ( SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn FROM makerar ) t JOIN makerar m ON m.cname = t.cname AND m.wmname = t.wmname AND t.rn = 1;</code>
これらのメソッドのいずれかを使用すると、国マネージャー名 (wmname) が各国の最大平均値に正しく関連付けられている、期待される結果を取得できます。 方法 3 の ROW_NUMBER()
の ORDER BY
節に注意してください。これは、最大平均を正しく選択するために重要です。 以前のバージョンにはこの句がなかったため、不正確な結果が生じる可能性がありました。
以上がSQL の「列 'wmname' は GROUP BY 句に指定するか、集計関数で使用する必要があります」を解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。