首頁 >資料庫 >mysql教程 >為什麼SQL查詢中會出現「列必須出現在GROUP BY子句中或在聚合函數中使用」的情況?

為什麼SQL查詢中會出現「列必須出現在GROUP BY子句中或在聚合函數中使用」的情況?

Patricia Arquette
Patricia Arquette原創
2025-01-18 14:01:09470瀏覽

Why Does

SQL 錯誤:列必須出現在 GROUP BY 子句中或用作聚合函數

執行分組聚合查詢時,必須確保所選列要麼出現在 GROUP BY 子句中,要麼參與聚合函數的計算。否則,將會出現類似「列必須出現在 GROUP BY 子句中或用作聚合函數」的錯誤訊息。

問題描述

假設有一個名為 makerar 的表,包含 cnamewmnameavg 等欄位。目標是為每個不同的 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn