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

MySQL计算收支差额结果异常,求正确实现方案

MySQL计算收支差额结果异常,求正确实现方案

兄弟,你这个问题我之前踩过一模一样的坑!问题根源出在你写的FROM income, expenses上——这是隐式交叉连接,会让两个表做笛卡尔积:每一条收入记录都会和每一条支出记录配对组合。

举个实际的例子,你的收入表有7条数据,支出表有195条,交叉之后就会生成7×195=1365行数据。这时候你用SUM(rent)得到的其实是10150×195,SUM(cost)是4576.51×7,算出来的差额自然完全不对了。

给你几个靠谱的解决方法,随便选一个都能得到你想要的5573.49:

方法1:用独立子查询计算总和后相减

这种方法最直观,直接分别算出收入和支出的总金额,再做减法:

SELECT 
    (SELECT SUM(rent) FROM income) AS total_income,
    (SELECT SUM(cost) FROM expenses) AS total_expenses,
    (SELECT SUM(rent) FROM income) - (SELECT SUM(cost) FROM expenses) AS grand_total;

方法2:将总和作为临时表后计算

把两个表的总和分别作为单行列的临时表,再交叉连接(因为都是单行,交叉后还是一行,不会有笛卡尔积问题):

SELECT 
    inc.total_income,
    exp.total_expenses,
    inc.total_income - exp.total_expenses AS grand_total
FROM
    (SELECT SUM(rent) AS total_income FROM income) inc,
    (SELECT SUM(cost) AS total_expenses FROM expenses) exp;

方法3:用UNION ALL合并后聚合

先把收支的总金额合并到一个数据集里,再统一计算差额:

SELECT
    SUM(income_amount) AS total_income,
    SUM(expense_amount) AS total_expenses,
    SUM(income_amount) - SUM(expense_amount) AS grand_total
FROM (
    SELECT SUM(rent) AS income_amount, 0 AS expense_amount FROM income
    UNION ALL
    SELECT 0 AS income_amount, SUM(cost) AS expense_amount FROM expenses
) combined;

核心思路就是:一定要确保你是在两个独立的总金额数值之间做减法,而不是在交叉连接后的大数据集上做sum操作。试试上面的方法,肯定能得到你想要的结果!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 09:53:11