解决 SQL 查询错误:"must appear in the GROUP BY clause or be used in an aggregate function"
在 SQL 中,执行聚合操作(如 MAX、MIN、SUM 等)时,SELECT
列表中的列必须出现在 GROUP BY
子句中,或者包含在聚合函数中。此限制确保结果正确分组,并正确计算聚合值。
例如,假设您的表包含 cname
、wmname
和 avg
列,您想查找每个 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>
这种方法会为每个 cname
和 wmname
组合返回最大 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中文网其他相关文章!