ホームページ >データベース >mysql チュートリアル >SQL「列はGROUP BY句に出現する必要があります」エラーを解決する方法?

SQL「列はGROUP BY句に出現する必要があります」エラーを解決する方法?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-18 14:06:13760ブラウズ

How to Solve the 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 ごとに複数の行が作成されます。この問題を修正するには、次のいずれかの方法に従ってください:

サブクエリと結合の使用

  1. サブクエリ内の各 cname の最大平均値を計算します:
<code class="language-sql">SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname;</code>
  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>

ウィンドウ関数を使用する

ウィンドウ関数を使用すると、指定したウィンドウ内の行全体で計算を実行できます。この場合、PARTITION BY 句を使用して cname でグループ化し、各パーティションの最大平均値を計算できます:

<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx
FROM makerar;</code>

このメソッドはすべてのレコードを表示しますが、行ごとの cname ごとの最大平均値が正しく表示されます。

一意のタプルの一致を処理します

最大平均値に一致する一意のタプルのみを表示したい場合は、次のメソッドを使用できます:

  1. ROW_NUMBER() 関数を使用して、各 cname パーティション内の平均値のランキングを計算します。
<code class="language-sql">SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn 
FROM makerar;</code>
  1. 結果を元のテーブルと結合して、rn = 1 (最初にランク付けされたタプル) をフィルターします:
<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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。