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