ホームページ >データベース >mysql チュートリアル >SQL「列はGROUP BY句に出現する必要があります」エラーを解決する方法?
SQL で集計操作 (最大値の検索など) を実行する場合、集計に使用される列は GROUP BY 句にも指定する必要があります。これを行わないと、「列は GROUP BY 句に指定するか、集計関数として使用する必要があります」というエラーが発生します。
テーブル内の各顧客名 (cname) の最大平均値 (avg) を見つけたいとします。
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;</code>
wmname が GROUP BY 句に含まれていないため、このクエリはエラーを返します。これを修正するには、cname と wmname でグループ化するだけです:
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;</code>
ただし、この方法では、一意の各 cname の最大平均値を表示するという期待どおりの結果は生成されません。代わりに、cname と wmname によってグループ化され、cname ごとに複数の行が作成されます。この問題を修正するには、次のいずれかの方法に従ってください:
<code class="language-sql">SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname;</code>
<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>
ウィンドウ関数を使用すると、指定したウィンドウ内の行全体で計算を実行できます。この場合、PARTITION BY 句を使用して cname でグループ化し、各パーティションの最大平均値を計算できます:
<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar;</code>
このメソッドはすべてのレコードを表示しますが、行ごとの cname ごとの最大平均値が正しく表示されます。
最大平均値に一致する一意のタプルのみを表示したい場合は、次のメソッドを使用できます:
<code class="language-sql">SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn FROM makerar;</code>
<code class="language-sql">SELECT DISTINCT /* distinct matters here */ 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>
このメソッドは、各 cname の最大平均値を含む一意のタプルのリストを返します。 ORDER BY avg DESC
に基づいてランキングが降順になるように avg
を追加していることに注意してください。
以上がSQL「列はGROUP BY句に出現する必要があります」エラーを解決する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。