对SUM聚合字段使用WHERE过滤失败,求原因及解决方法
为什么你的SQL无法过滤聚合字段?
嘿,这个问题我太熟了!你遇到的是SQL里WHERE和HAVING的核心区别问题,我来给你掰扯清楚:
问题根源
你的SQL语句里WHERE accumulated > 50000这部分是报错的关键。SQL的执行顺序是有严格优先级的:
- 第一步:执行
WHERE子句,过滤原始数据表中的行 - 第二步:按照
GROUP BY分组 - 第三步:计算
SUM()这类聚合函数,生成accumulated这样的聚合字段
也就是说,当数据库处理WHERE的时候,accumulated这个字段还没被计算出来呢——它是分组之后才生成的,数据库根本不知道这个字段是什么,自然会拒绝执行你的语句。
正确的写法
要过滤聚合字段的结果,你得用HAVING子句,它是专门用来在分组完成后过滤聚合结果的。修改后的SQL应该是这样:
SELECT SUM(value) as accumulated, id_motorist FROM trip GROUP by id_motorista HAVING accumulated > 50000
额外小技巧
如果需要先过滤原始数据(比如只统计2024年的行程),可以同时用WHERE和HAVING:先用WHERE过滤原始行,再用HAVING过滤聚合结果,比如:
SELECT SUM(value) as accumulated, id_motorist FROM trip WHERE trip_date >= '2024-01-01' -- 先筛选2024年的行程 GROUP by id_motorista HAVING accumulated > 50000 -- 再筛选总金额超过5万的司机
内容的提问来源于stack exchange,提问作者UBER JAJA
相关产品推荐
相关产品推荐

