我有一个包含以下数据的表:
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/