解決「必須出現在 GROUP BY 子句中或在聚合函數中使用」SQL 錯誤
當查詢將資料分組(使用GROUP BY
)但選擇不參與分組的列時,會出現SQL 錯誤“列“makerar.wmname”必須出現在GROUP BY 子句中或在聚合函數中使用” 。 SQL 要求任何不在 GROUP BY
子句中的選定列必須聚合(例如,使用 MAX
、MIN
、AVG
、SUM
、COUNT
)或省略。
解:
以下是解決此問題的幾種方法:
在 wmname
子句中包含 GROUP BY
:
如果您需要與每個唯一 wmname
關聯的所有 cname
值,這是最簡單的解決方案。
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;</code>
最大值子查詢和 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
.
視窗函數(如果支援):
如果您的資料庫系統支援視窗函數(大多數現代系統都支援),這提供了一個簡潔且有效率的解決方案。
<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中文網其他相關文章!