解決 SQL 查詢錯誤:"must appear in the GROUP BY clause or be used in an aggregate function"
在 SQL 中,執行聚合操作(如 MAX、MIN、SUM 等)時,SELECT
清單中的欄位必須出現在 GROUP BY
子句中,或包含在聚合函數中。此限制確保結果正確分組,並正確計算聚合值。
例如,假設您的表包含 cname
、wmname
和 avg
列,您想找出每個 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>
這種方法會為每個 cname
和 wmname
組合傳回最大 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中文網其他相關文章!