MySQL如何按类型求和筛选苹果消费总额高于橙子的客户ID
报错原因
- 错误代码1111的触发原因是聚合函数不能直接用于WHERE子句:SQL执行顺序中,WHERE是在分组聚合操作之前对原始行做过滤的,此时SUM()这类聚合函数还没有完成计算,无法作为判断条件使用。
- 你的原逻辑也存在缺陷:没有预先聚合计算苹果的总消费,直接在JOIN后的原表记录上调用SUM()做比较,逻辑不成立。
正确写法
写法1:和你原有思路一致,分别聚合两类商品消费后比对
先分别计算每个客户的橙子总消费、苹果总消费,再关联两个结果做筛选,逻辑直观:
SELECT o.customer FROM ( -- 统计每个客户的橙子总消费 SELECT customer, SUM(payment) AS oranges_paid FROM 你的实际表名 WHERE type = 'Oranges' GROUP BY customer ) o INNER JOIN ( -- 统计每个客户的苹果总消费 SELECT customer, SUM(payment) AS apples_paid FROM 你的实际表名 WHERE type = 'Apples' GROUP BY customer ) a ON o.customer = a.customer WHERE a.apples_paid > o.oranges_paid ORDER BY o.customer;
写法2:条件聚合,单轮扫描表完成计算,性能更优
通过CASE表达式做条件聚合,一次计算出每个客户两类商品的总消费,再用HAVING筛选聚合结果,写法更简洁:
SELECT customer FROM 你的实际表名 GROUP BY customer HAVING SUM(CASE WHEN type = 'Apples' THEN payment ELSE 0 END) > SUM(CASE WHEN type = 'Oranges' THEN payment ELSE 0 END) ORDER BY customer;
两种写法代入你的示例数据,最终输出结果都是1,符合需求。使用时请把你的实际表名替换为你自己的表名即可。
内容的提问来源于stack exchange,提问作者rinwin
相关产品推荐
相关产品推荐

