首页 > 数据库 > mysql教程 > 如何解决SQL'列必须出现在GROUP BY子句中”错误?

如何解决SQL'列必须出现在GROUP BY子句中”错误?

Mary-Kate Olsen
发布: 2025-01-18 14:06:13
原创
758 人浏览过

How to Solve the SQL

解决“错误:列必须出现在GROUP BY子句中”

在SQL中,执行聚合操作(例如查找最大值)时,用于聚合的列也必须出现在GROUP BY子句中。否则将导致错误:“列必须出现在GROUP BY子句中或用作聚合函数”。

假设您想要查找表中每个客户名称 (cname) 的最大平均值 (avg):

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

此查询将返回错误,因为wmname未包含在GROUP BY子句中。要解决此问题,您可以简单地按cname和wmname进行分组:

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

但是,此方法不会产生显示每个唯一cname的最大avg值的预期结果。相反,它将按cname和wmname分组,导致每个cname有多行。要纠正此问题,请遵循以下方法之一:

使用子查询和连接

  1. 在子查询中计算每个cname的最大avg值:
<code class="language-sql">SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname;</code>
登录后复制
  1. 将子查询与原始表连接以检索所需的列:
<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>
登录后复制

使用窗口函数

窗口函数允许您在指定窗口内跨行执行计算。在这种情况下,您可以使用PARTITION BY子句按cname分组,并在每个分区中计算最大avg值:

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

此方法将显示所有记录,但它将正确显示每行每个cname的最大avg值。

处理匹配的唯一元组

如果您只想显示与最大avg值匹配的唯一元组,可以使用以下方法:

  1. 使用ROW_NUMBER()函数计算每个cname分区内avg值的排名:
<code class="language-sql">SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn 
FROM makerar;</code>
登录后复制
  1. 将结果与原始表连接以过滤rn = 1(排名第一的元组):
<code class="language-sql">SELECT DISTINCT /* distinct matters here */
    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>
登录后复制

此方法将返回一个唯一元组列表,其中包含每个cname的最大avg值。 注意ORDER BY avg DESC 的加入,确保排名是根据avg降序排列的。

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

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