MySQL按年月分组左连接求和结果异常问题求助
搞定MySQL多表按年月分组求和的重复计算问题
嘿,你这明显是踩了表连接导致重复行求和的坑!我给你拆解下问题,再给你个靠谱的解决方案:
为啥结果不对?
你当前的查询逻辑有个漏洞:虽然你先对sell_master按年月做了分组,得到10月的总和是10,但当你把这个分组结果左连接到new_order时,new_order里2007-10月有4条记录,这就导致sell_master那条10月的统计行被重复关联了4次。最后外层的sum(t2.total_amount)就把10加了4次,变成了错误的40,而不是你要的10。
修正后的正确查询
正确的姿势是先分别把两个表的年月求和统计好,再做连接,这样就不会出现重复行的问题:
SELECT -- 优先取t1的年月,没有的话用t2的,保证所有月份都能显示 COALESCE(t1.year_month, t2.year_month) AS year_month, -- 处理null值,确保没有数据时显示0 COALESCE(t1.SumOfNO, 0) AS SumOfNO, COALESCE(t2.SumOfSM, 0) AS SumOfSM, COALESCE(t1.SumOfNO, 0) + COALESCE(t2.SumOfSM, 0) AS Total FROM -- 先统计new_order的年月求和 ( SELECT DATE_FORMAT(order_date, '%Y-%m') AS year_month, SUM(IFNULL(received_amt, 0)) AS SumOfNO FROM new_order GROUP BY DATE_FORMAT(order_date, '%Y-%m') ) t1 -- 左连接sell_master的年月统计结果,如果你要包含只有销售记录的月份,换成FULL JOIN(MySQL8.0+支持) LEFT JOIN ( SELECT DATE_FORMAT(sell_date, '%Y-%m') AS year_month, SUM(IFNULL(total_amount, 0)) AS SumOfSM FROM sell_master GROUP BY DATE_FORMAT(sell_date, '%Y-%m') ) t2 ON t1.year_month = t2.year_month ORDER BY year_month DESC;
测试结果
用你给的示例数据跑这条查询,会得到你想要的结果:
+------------+---------+---------+-------+ | year_month | SumOfNO | SumOfSM | Total | +------------+---------+---------+-------+ | 2007-10 | 1130 | 10 | 1140 | +------------+---------+---------+-------+
额外小贴士
- 用
DATE_FORMAT代替FORMAT处理日期更稳妥,不会因为系统区域设置搞出奇怪的格式问题。 - 如果你的MySQL版本低于8.0,不支持
FULL JOIN,可以用UNION ALL来合并两个表的统计结果,再做求和,同样能实现包含所有月份的需求。
内容的提问来源于stack exchange,提问作者JohnR
相关产品推荐
相关产品推荐

