使用GROUP BY时Sum()求和结果错误,MySQL查询问题求助
解决MySQL多表连接后求和结果不正确的问题
嘿,我看你遇到了多表连接后SUM()结果不准的麻烦,这几乎肯定是多表连接产生笛卡尔积导致的——当inv_temp和vanMoney之间是一对多的关联关系时,直接左连接会让inv_temp里的行被重复匹配多次,SUM()计算时就会把这些重复行也累加进去,结果自然就偏大了。
修复思路:先聚合子表,再连接主表
我们可以先对需要求和的inv_temp表按关联字段单独做聚合计算,得到每个source_id对应的唯一汇总值,再和其他表连接,这样就能避免重复行的干扰。修复后的SQL语句如下:
SELECT s.source, vm.userid, vm.Username, vm.vandate, vm.FirstBuy, vm.LastBuy, vm.SourceID, vm.TodayDate, it.TotalCost, it.TotalQTY FROM source AS s LEFT JOIN ( -- 先对inv_temp按source_id聚合,算出每个来源的总成本和总数量 SELECT source_id, SUM(cost * quantity) AS TotalCost, SUM(quantity) AS TotalQTY FROM inv_temp -- 把你原WHERE子句中关于quantity的完整条件加在这里(比如WHERE quantity > 0) GROUP BY source_id ) AS it ON it.source_id = s.source_id LEFT JOIN vanMoney AS vm ON s.source_id = vm.SourceID WHERE s.buyer_type_id = 6 -- 如果需要按字段分组展示,这里补充对应的GROUP BY字段,比如: -- GROUP BY s.source, vm.userid, vm.Username, vm.vandate, vm.FirstBuy, vm.LastBuy, vm.SourceID, vm.TodayDate
关键说明:
- 子查询聚合的作用:子查询里先完成
inv_temp的求和,确保每个source_id只返回一行汇总数据,这样连接其他表时不会产生重复行。 - 处理
vanMoney的关联:如果vanMoney和source也是一对多关系,那你可能需要对vanMoney也做类似的聚合处理,或者调整连接逻辑,否则还是可能出现重复行影响结果。 - 补全过滤条件:你原语句里的
WHERE quantity&...没写完,记得把完整的过滤条件加到子查询的WHERE中,确保数据范围正确。
内容的提问来源于stack exchange,提问作者Scottmike Forgiven
相关产品推荐
相关产品推荐

