MySQL单查询实现客户全门店及指定门店总交易额计算(无重复子查询无GROUP BY)
优化方案
你可以使用条件聚合的方式实现需求,仅需一次表查询即可得到两个统计值,无需重复编写子查询,也不需要使用GROUP BY。
首先修正你原有SQL的一处错误:根据你给出的表结构,store_id是Orders表的字段,不是Clients表的字段,原有查询的WHERE条件里写的clients.store_id = '51'存在字段归属错误。
优化后查询语句
SELECT SUM(o.gross_amount) AS all_store, SUM(IF(o.store_id = 51, o.gross_amount, 0)) AS my_store FROM Clients c INNER JOIN Orders o ON c.id = o.client_id WHERE c.passport = 'xxx' AND FROM_UNIXTIME(o.date_time) >= NOW() - INTERVAL 1 YEAR;
逻辑说明
- 把公共的过滤条件(指定客户护照、近1年的订单范围)统一放在WHERE子句中,仅做一次表关联和数据过滤,避免了原有方案两次子查询的重复计算开销
- 全部门店总交易额
all_store直接对过滤后的所有订单金额求和即可 - 特定门店交易额
my_store通过IF条件判断:只有订单所属门店为指定ID时才计入求和,不符合条件的订单贡献值为0,不影响统计结果 - 因为WHERE已经过滤为单个客户的符合条件的订单,聚合后天然返回单行结果,完全匹配你需要的输出格式
内容的提问来源于stack exchange,提问作者Venda 97
相关产品推荐
相关产品推荐

