SQL クエリ エラーを解決します:「GROUP BY 句に指定するか、集計関数で使用する必要があります」
SQL で集計操作 (MAX、MIN、SUM など) を実行する場合、SELECT
リスト内の列は GROUP BY
句に含めるか、集計関数に含める必要があります。この制限により、結果が正しくグループ化され、集計値が正しく計算されることが保証されます。
たとえば、テーブルに cname
、wmname
、および avg
列が含まれており、各 cname
の最大 avg
値を見つけたいとします。元のクエリは次のとおりです:
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;</code>
wmname
列が GROUP BY
句に含まれておらず、集計関数でも使用されていないため、このクエリは失敗します。これは、MAX
集計関数が wmname
でグループ化されずに評価されるため、不正確な結果が生じることを意味します。
次の方法でこの問題を解決できます:
方法 1: wmname
句に GROUP BY
を含めます:
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;</code>
このメソッドは、cname
と wmname
の組み合わせごとに最大の avg
値を返します。
方法 2: サブクエリを使用する:
<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>
このメソッドは、まずサブクエリを使用して各 cname
の最大 avg
値を計算し、それを元のテーブルと結合して、対応する wmname
値を取得します。
方法 3: ウィンドウ関数を使用する:
<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar;</code>
ウィンドウ関数 MAX(avg) OVER (PARTITION BY cname)
は、各 cname
の最大 avg
値を計算し、結果内のすべての行を保持します。ただし、指定された cname
に対して同じ最大 avg
値を持つ行が複数ある場合、このメソッドでは重複した行が表示される可能性があります。
非集計関数列を GROUP BY
句に含める必要があるという要件に正しく従うことで、集計クエリが正確で意味のある結果を生成することを保証できます。
以上がSQL クエリが「GROUP BY 句に出現するか、集計関数で使用されなければなりません」というメッセージで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。