首頁 > 資料庫 > mysql教程 > 為什麼我的 SQL 查詢失敗並顯示'必須出現在 GROUP BY 子句中或在聚合函數中使用”?

為什麼我的 SQL 查詢失敗並顯示'必須出現在 GROUP BY 子句中或在聚合函數中使用”?

Mary-Kate Olsen
發布: 2025-01-18 14:11:10
原創
783 人瀏覽過

Why Does My SQL Query Fail with

解決 SQL 查詢錯誤:"must appear in the GROUP BY clause or be used in an aggregate function"

在 SQL 中,執行聚合操作(如 MAX、MIN、SUM 等)時,SELECT 清單中的欄位必須出現在 GROUP BY 子句中,或包含在聚合函數中。此限制確保結果正確分組,並正確計算聚合值。

例如,假設您的表包含 cnamewmnameavg 列,您想找出每個 cname 的最大 avg 值。您最初的查詢如下:

<code class="language-sql">SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname;</code>
登入後複製

此查詢失敗,因為 wmname 欄位既未包含在 GROUP BY 子句中,也未用於聚合函數。這表示 MAX 聚合函數在未依 wmname 分組的情況下計算,導致結果不正確。

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

方法一:將 wmname 包含在 GROUP BY 子句中:

<code class="language-sql">SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname, wmname;</code>
登入後複製

這種方法會為每個 cnamewmname 組合傳回最大 avg 值。

方法二:使用子查詢:

<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 值。

方法三:使用視窗函數:

<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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板