SQL 錯誤:列必須出現在 GROUP BY 子句中或用作聚合函數
執行分組聚合查詢時,必須確保所選列要麼出現在 GROUP BY
子句中,要麼參與聚合函數的計算。否則,將會出現類似「列必須出現在 GROUP BY 子句中或用作聚合函數」的錯誤訊息。
問題描述
假設有一個名為 makerar
的表,包含 cname
、wmname
和 avg
等欄位。目標是為每個不同的 cname
取得最大的 avg
值。但是,請執行以下查詢:
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;</code>
將會報錯,因為 wmname
欄位既沒有包含在 GROUP BY
子句中,也沒有用作聚合函數。
解
解決此問題主要有兩種方法:
1. 子查詢與連接方法
此方法使用子查詢計算每個 cname
的最大 avg
值,然後將子查詢與主表連接,以檢索相應的 wmname
:
<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>
2. 視窗函數方法
視窗函數提供了一種更簡單的替代方法,可以在群組內執行聚合計算:
<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar ;</code>
注意:雖然視窗函數可以正確顯示每個 cname
的最大 avg
值,但可能會導致重複記錄。
以上是為什麼SQL查詢中會出現「列必須出現在GROUP BY子句中或在聚合函數中使用」的情況?的詳細內容。更多資訊請關注PHP中文網其他相關文章!