ホームページ > データベース > mysql チュートリアル > SQL クエリが「GROUP BY 句に出現するか、集計関数で使用されなければなりません」というメッセージで失敗するのはなぜですか?

SQL クエリが「GROUP BY 句に出現するか、集計関数で使用されなければなりません」というメッセージで失敗するのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-18 14:11:10
オリジナル
781 人が閲覧しました

Why Does My SQL Query Fail with

SQL クエリ エラーを解決します:「GROUP BY 句に指定するか、集計関数で使用する必要があります」

SQL で集計操作 (MAX、MIN、SUM など) を実行する場合、SELECT リスト内の列は GROUP BY 句に含めるか、集計関数に含める必要があります。この制限により、結果が正しくグループ化され、集計値が正しく計算されることが保証されます。

たとえば、テーブルに cnamewmname、および 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>
ログイン後にコピー

このメソッドは、cnamewmname の組み合わせごとに最大の 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート