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中文网其他相关文章!