首页 >数据库 >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