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