mysql - 用mysql计算余额

标签 mysql sql cumulative-sum balance

我有一个包含以下数据的表:

ID      In       Out 
1      100.00    0.00   
2       10.00    0.00   
3        0.00   70.00    
4        5.00    0.00    
5        0.00   60.00   
6       20.00    0.00     

现在我需要一个能给我以下结果的查询:

ID      In       Out    Balance
1      100.00    0.00   100.00
2       10.00    0.00   110.00
3        0.00   70.00    40.00
4        5.00    0.00    45.00
5        0.00   60.00   -15.00
6       20.00    0.00     5.00

是否可以在不使用触发器或存储过程的情况下通过一个查询来完成此操作?

最佳答案

简短的回答,是的

更长的答案,你可以使用一个变量来计算它,因为它迭代行,即

SELECT 
    `table`.`ID`,
    `table`.`In`,
    `table`.`Out`,
    @Balance := @Balance + `table`.`In` - `table`.`Out` AS `Balance`
FROM `table`, (SELECT @Balance := 0) AS variableInit
ORDER BY `table`.`ID` ASC

, (SELECT @Balance := 0) AS variableInit 确保@Balance 在开始前被初始化为 0。对于每一行,它将 @Balance 设置为 @Balance + In - Out,然后输出计算值。

同样值得确保 ORDER 是一致的,否则余额将根据返回行的顺序而变化。例如,如果你想将它从头到尾排序,你可以将它用作子查询,因为外部查询会处理计算值,从而确保余额保持正确,即

SELECT
    `balanceCalculation`.`ID`,
    `balanceCalculation`.`In`,
    `balanceCalculation`.`Out`,
    `balanceCalculation`.`Balance`
FROM (
    SELECT 
        `table`.`ID`,
        `table`.`In`,
        `table`.`Out`,
        @Balance := @Balance + `table`.`In` - `table`.`Out` AS `Balance`
    FROM `table`, (SELECT @Balance := 0) AS variableInit
    ORDER BY `table`.`ID` ASC
) AS `balanceCalculation`
ORDER BY `balanceCalculation`.`ID` DESC

关于mysql - 用mysql计算余额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9394418/

相关文章:

python - Pandas:撤消累积(例如累积和)

excel - DAX 累积 SUM 忽略我的过滤器

sql-server - SQL Server 渐进/复合减法?

sql - 如何在Linux/Grails/Groovy环境中的Grails h2数据源中 “look at data”?

AndroidPlot:无法在 Android 应用程序中显示列表数据的折线图

mysql - 以 root 身份访问 mysql 使我以匿名用户身份登录

mysql - Laravel whereBetween 不起作用。表明?

sql - 在 SQL 中获取 ROWCOUNT 值(不是 @@ROWCOUNT)

mysql - 如何在 SQL 中连接多个需要按时间过滤的表?

mysql - 如何为2个表创建外键?