首頁 >資料庫 >mysql教程 >為什麼我的 SQL 查詢會拋出「列必須出現在 GROUP BY 子句中或在聚合函數中使用」錯誤?

為什麼我的 SQL 查詢會拋出「列必須出現在 GROUP BY 子句中或在聚合函數中使用」錯誤?

Susan Sarandon
Susan Sarandon原創
2025-01-18 13:52:09399瀏覽

Why Does My SQL Query Throw a

解決「必須出現在 GROUP BY 子句中或在聚合函數中使用」SQL 錯誤

當查詢將資料分組(使用GROUP BY)但選擇不參與分組的列時,會出現SQL 錯誤“列“makerar.wmname”必須出現在GROUP BY 子句中或在聚合函數中使用” 。 SQL 要求任何不在 GROUP BY 子句中的選定列必須聚合(例如,使用 MAXMINAVGSUMCOUNT)或省略。

解:

以下是解決此問題的幾種方法:

  1. wmname 子句中包含 GROUP BY

    如果您需要與每個唯一 wmname 關聯的所有 cname 值,這是最簡單的解決方案。

    <code class="language-sql">SELECT cname, wmname, MAX(avg)
    FROM makerar
    GROUP BY cname, wmname;</code>
  2. 最大值子查詢和 JOIN:

    當您只需要與每個 wmname 的最大 avg 相對應的 cname 時,此方法很有用。

    <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 m.avg = t.mx;</code>

    這首先找出子查詢中每個 avg 的最大值 cname。然後,它將這個結果連接回原始表以檢索對應的 wmname.

  3. 視窗函數(如果支援):

    如果您的資料庫系統支援視窗函數(大多數現代系統都支援),這提供了一個簡潔且有效率的解決方案。

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

    視窗函數計算每個 avg 分區的最大值 cname,而不改變原始行結構。 如果您只想要獨特的結果,您可能需要 DISTINCT

透過實作其中一種方法,您將正確檢索每個 avg 的最大平均值 (cname),同時適當處理 wmname 列,從而消除 SQL 錯誤。 選擇最適合您的特定資料要求和資料庫功能的解決方案。

以上是為什麼我的 SQL 查詢會拋出「列必須出現在 GROUP BY 子句中或在聚合函數中使用」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn