使用GROUP BY时如何对不在SELECT列表中的列执行ORDER BY排序?
错误原因
SQLCODE=-854是严格SQL模式下的列引用校验错误:将IDKartoch从SELECT子句移除后,该列既不在最终返回的字段列表中,也未被聚合函数包裹,按照ANSI SQL标准,ORDER BY子句不能引用这类不在结果集范围内的列,因此抛出无效引用错误。
最初的SQL可在低版本MySQL运行,是因为低版本MySQL默认未开启ONLY_FULL_GROUP_BY严格校验,属于非标准兼容的宽松行为,不具备跨数据库、跨版本通用性。
正确实现方案
根据实际业务需求二选一即可:
- 方案1:需要保留按
IDKartoch分组排序的逻辑,且最终结果不展示IDKartoch字段
用子查询先完成分组、过滤、排序逻辑,外层只提取需要的Total字段即可:
SELECT Total FROM ( SELECT IDKartoch, SUM(SummOpl) AS Total FROM Oplata GROUP BY IDKartoch HAVING SUM(SummOpl) >= 0 ORDER BY IDKartoch ) AS res;
- 方案2:不需要按
IDKartoch排序,仅修改SELECT字段时遗漏调整ORDER BY
直接移除ORDER BY中无效的IDKartoch引用,可根据需要改为按返回的聚合字段排序,例如按合计值升序排列:
SELECT SUM(SummOpl) AS Total FROM Oplata GROUP BY IDKartoch HAVING SUM(SummOpl) >= 0 ORDER BY Total ASC;
内容的提问来源于stack exchange,提问作者ctchths
相关产品推荐
相关产品推荐

