Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用mysql计算余额_Mysql_Sql_Cumulative Sum_Balance - Fatal编程技术网

用mysql计算余额

用mysql计算余额,mysql,sql,cumulative-sum,balance,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

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

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
选择@Balance:=0作为variableInit可确保在开始之前将@Balance初始化为0。对于每一行,它将@Balance设置为@Balance+In-Out,然后输出计算值

此外,还需要确保顺序一致,否则余额将根据行返回的顺序而变化。例如,如果您想将其从前到后排序,您可以将其用作子查询,因为外部查询将处理计算值,从而确保余额保持正确

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

最简单的答案是:

SELECT `ID`, 
       `In`, 
       `Out`, 
       @running_bal := @running_bal + (`In` - `Out`)  as `Balance`
FROM   tableName, (SELECT @running_bal := 0) tempName
简单的左连接就足够了:

SELECT t.ID, t.In, t.Out, (SUM(t2.In) - SUM(t2.Out)) Balance
FROM mytable t
    LEFT JOIN mytable t2 ON b2.ID <= b.ID
GROUP BY b.ID
或者子查询的速度是原来的两倍

SELECT t.ID, t.In, t.Out,
    (SELECT SUM(t2.In) - SUM(t2.Out) FROM mytable t2 WHERE t2.ID <= t.ID) Balance
FROM mytable t;

如何分页,我认为这个查询将无法正常工作,平衡将无法进行well@PutraLZendrato恐怕我不明白这个问题,Hello Simon,我的意思是,如果数据行很大,例如,我们有100个数据,但不会在一个页面中加载。因此,我们分为两页分页工作。我认为运行平衡将不起作用。当子查询计算来自完整数据集的派生值时,您可以限制外部查询。你可以把平衡计算想象成另一张表。该限制不会更改总计,只会更改您从中选择的数据子集。是否仍有方法将其用于分页?