首页 > 数据库 > mysql教程 > 为什么我的 SQL 查询失败并显示'必须出现在 GROUP BY 子句中或在聚合函数中使用”?

为什么我的 SQL 查询失败并显示'必须出现在 GROUP BY 子句中或在聚合函数中使用”?

Mary-Kate Olsen
发布: 2025-01-18 14:11:10
原创
731 人浏览过

Why Does My SQL Query Fail with

解决 SQL 查询错误:"must appear in the GROUP BY clause or be used in an aggregate function"

在 SQL 中,执行聚合操作(如 MAX、MIN、SUM 等)时,SELECT 列表中的列必须出现在 GROUP BY 子句中,或者包含在聚合函数中。此限制确保结果正确分组,并正确计算聚合值。

例如,假设您的表包含 cnamewmnameavg 列,您想查找每个 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>
登录后复制

这种方法会为每个 cnamewmname 组合返回最大 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板