You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:15:53