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

MySQL按月份与描述分组表数据求和异常求助

在MySQL中按月份+描述分组求和的正确实现

我来帮你排查下问题,并且给出能达到你需求的解决方案~

首先,你的SQL语句逻辑本身是没问题的,但出现“仅罗列数据、没正确求和”的情况,大概率是这两个原因之一:

  • 你的petty_cash_logs表中,month+description的组合本身就是唯一的:也就是说每一行的月份和描述都不重复,那SUM(amount)自然就是单条记录的金额,看起来像只是罗列数据。你可以先跑这条查询验证一下:
    SELECT month, description, COUNT(*) AS record_count, SUM(amount) AS total_amount
    FROM petty_cash_logs
    GROUP BY month, description;
    
    如果record_count列全是1,那就说明每个分组只有一条数据,求和结果自然等于单条金额。
  • month列的数据格式不统一:比如有的行存的是数字1,有的是字符串'1月',或者英文月份名'Jan'和'January'混用,这样会被MySQL当成不同的分组,导致本该合并的记录被分开了。

针对你的需求,我给你调整后的SQL语句,同时加上月份排序(保证结果按1-12月的顺序展示):

基础正确版(month是数字1-12)

INSERT INTO summary(transdate, particulars, amount_cr)
SELECT 
    month, 
    description, 
    SUM(amount)
FROM petty_cash_logs
GROUP BY month, description
ORDER BY month ASC; -- 强制按1到12月的顺序排列

如果month是英文月份名(比如'January')

如果你的month列存的是英文月份全称/简称,需要用FIELD()函数指定排序顺序,避免按字母顺序乱排:

INSERT INTO summary(transdate, particulars, amount_cr)
SELECT 
    month, 
    description, 
    SUM(amount)
FROM petty_cash_logs
GROUP BY month, description
ORDER BY FIELD(month, 'January', 'February', 'March', 'April', 'May', 'June', 
               'July', 'August', 'September', 'October', 'November', 'December');

处理重复数据(可选)

如果你的summary表中可能已经存在相同的month+particulars组合,直接插入会报错,可以用ON DUPLICATE KEY UPDATE来更新已有记录的金额:

-- 前提:需要给summary表的transdate和particulars列设置联合唯一索引
INSERT INTO summary(transdate, particulars, amount_cr)
SELECT 
    month, 
    description, 
    SUM(amount)
FROM petty_cash_logs
GROUP BY month, description
ON DUPLICATE KEY UPDATE 
    amount_cr = VALUES(amount_cr); -- 有重复时替换为新的求和金额

内容的提问来源于stack exchange,提问作者Kevsoft Softwares

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:36:40