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
相关产品推荐
相关产品推荐

