首頁 > 資料庫 > mysql教程 > 如何解決SQL中「列'wmname'必須出現在GROUP BY子句中或在聚合函數中使用」?

如何解決SQL中「列'wmname'必須出現在GROUP BY子句中或在聚合函數中使用」?

Barbara Streisand
發布: 2025-01-18 13:56:11
原創
397 人瀏覽過

How to Solve

解決SQL錯誤:「欄位必須出現在GROUP BY子句或用作聚合函數」

在SQL查詢中,如果選擇欄位既未包含在GROUP BY子句中,也未進行任何聚合操作,就會出現「列'wmname'必須出現在GROUP BY子句中或用作聚合函數”的錯誤訊息。

具體來說,您試圖查找每個國家(cname)的最大平均值(avg),同時返回相應的國家經理姓名(wmname)。但是,wmname既未包含在GROUP BY子句中,也未用在任何聚合函數中。

可能的解決方案:

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

方法一:使用子查詢與連接

此方法包括建立一個子查詢來計算每個國家/地區的最大平均值,然後將結果與原始表連接以包含國家/地區經理的姓名。

<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>
登入後複製

方法二:使用視窗函數

視窗函數提供了一種無需使用子查詢即可獲得此結果的方法。

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

方法三:使用DISTINCT和ROW_NUMBER()

一種更明確的方法是使用DISTINCT來確保唯一的結果,並使用ROW_NUMBER()來僅選擇每個國家/地區平均值最高的行。

<code class="language-sql">SELECT DISTINCT /* distinct here matters, because maybe there are various tuples for the same max value */
    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>
登入後複製

透過使用其中一種方法,您可以檢索預期的結果,其中國家經理姓名(wmname)與每個國家/地區的最大平均值正確關聯。 請注意方法三中ROW_NUMBER()ORDER BY子句,這對於正確選擇最大平均值至關重要。 先前的版本缺少此子句,可能導致不正確的結果。

以上是如何解決SQL中「列'wmname'必須出現在GROUP BY子句中或在聚合函數中使用」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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