首页 > 数据库 > mysql教程 > 如何解决SQL中'列'wmname'必须出现在GROUP BY子句中或在聚合函数中使用”?

如何解决SQL中'列'wmname'必须出现在GROUP BY子句中或在聚合函数中使用”?

Barbara Streisand
发布: 2025-01-18 13:56:11
原创
397 人浏览过

How to Solve

解决SQL错误:“列必须出现在GROUP BY子句中或用作聚合函数”

在SQL查询中,如果选择字段既未包含在GROUP BY子句中,也未进行任何聚合操作,就会出现“列'wmname'必须出现在GROUP BY子句中或用作聚合函数”的错误消息。

具体来说,您试图查找每个国家(cname)的最大平均值(avg),同时返回相应的国家经理姓名(wmname)。但是,wmname既未包含在GROUP BY子句中,也未用在任何聚合函数中。

可能的解决方案:

有几种方法可以解决此问题:

方法一:使用子查询和连接

此方法包括创建一个子查询来计算每个国家/地区的最大平均值,然后将结果与原始表连接以包含国家/地区经理的姓名。

<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>
登录后复制

方法二:使用窗口函数

窗口函数提供了一种无需使用子查询即可获得此结果的方法。

<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx
FROM makerar;</code>
登录后复制

方法三:使用DISTINCT和ROW_NUMBER()

一种更明确的方法是使用DISTINCT来确保唯一的结果,并使用ROW_NUMBER()来仅选择每个国家/地区平均值最高的行。

<code class="language-sql">SELECT DISTINCT /* distinct here matters, because maybe there are various tuples for the same max value */
    m.cname, m.wmname, t.avg AS mx
FROM (
    SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn 
    FROM makerar
) t JOIN makerar m ON m.cname = t.cname AND m.wmname = t.wmname AND t.rn = 1;</code>
登录后复制

通过使用其中一种方法,您可以检索预期的结果,其中国家经理姓名(wmname)与每个国家/地区的最大平均值正确关联。 请注意方法三中ROW_NUMBER()ORDER BY子句,这对于正确选择最大平均值至关重要。 之前的版本缺少此子句,可能导致不正确的结果。

以上是如何解决SQL中'列'wmname'必须出现在GROUP BY子句中或在聚合函数中使用”?的详细内容。更多信息请关注PHP中文网其他相关文章!

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