解决“必须出现在 GROUP BY 子句中或在聚合函数中使用”SQL 错误
当查询对数据进行分组(使用 GROUP BY
)但选择不参与分组的列时,会出现 SQL 错误“列“makerar.wmname”必须出现在 GROUP BY 子句中或在聚合函数中使用”。 SQL 要求任何不在 GROUP BY
子句中的选定列必须聚合(例如,使用 MAX
、MIN
、AVG
、SUM
、COUNT
)或省略。
解决方案:
以下是解决此问题的几种方法:
在 wmname
子句中包含 GROUP BY
:
如果您需要与每个唯一 wmname
关联的所有 cname
值,这是最简单的解决方案。
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;</code>
最大值子查询和 JOIN:
当您只需要与每个 wmname
的最大 avg
相对应的 cname
时,此方法很有用。
<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 m.avg = t.mx;</code>
这首先查找子查询中每个 avg
的最大值 cname
。然后,它将这个结果连接回原始表以检索相应的 wmname
.
窗口函数(如果支持):
如果您的数据库系统支持窗口函数(大多数现代系统都支持),这提供了一个简洁高效的解决方案。
<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar;</code>
窗口函数计算每个 avg
分区的最大值 cname
,而不改变原始行结构。 如果您只想要独特的结果,您可能需要 DISTINCT
。
通过实现其中一种方法,您将正确检索每个 avg
的最大平均值 (cname
),同时适当处理 wmname
列,从而消除 SQL 错误。 选择最适合您的特定数据要求和数据库功能的解决方案。
以上是为什么我的 SQL 查询抛出'列必须出现在 GROUP BY 子句中或在聚合函数中使用”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!