根据先前和实际行值计算行值

Moh*_*ani 12 mysql row

大家好,感谢您的帮助。
我有以下情况:一个名为 statements 的表,其中包含字段id (int)、stmnt_date (date)、debit (double)、credit (double) 和balance (double) 我的表的结构

我想按照以下规则计算余额:

第一行余额(按时间顺序)= 借方 - 贷方,其余行

当前行余额 = 按时间顺序前一行余额 + 当前行借方 - 当前行贷方

正如您在上面的图片中看到的,行不是按日期排列的,这就是为什么我按时间顺序使用这个词两次来强调 stmnt_date 值的重要性。

非常感谢您的帮助。

ype*_*eᵀᴹ 12

假设stmnt_date有一个UNIQUE约束,这对于窗口/分析函数会很容易:

SELECT 
    s.stmnt_date, s.debit, s.credit,
    SUM(s.debit - s.credit) OVER (ORDER BY s.stmnt_date
                                  ROWS BETWEEN UNBOUNDED PRECEDING
                                           AND CURRENT ROW)
        AS balance
FROM
    statements AS s
ORDER BY
    stmnt_date ;
Run Code Online (Sandbox Code Playgroud)

不幸的是,MySQL(还)没有实现分析功能。您可以使用严格的 SQL,通过自联接表(尽管 100% 工作效率低下)或使用特定的 MySQL 功能、变量(这将非常有效,但您必须对其进行测试)来解决问题在升级 mysql 时,要确保结果仍然正确并且没有被一些优化改进所破坏):

SELECT 
    s.stmnt_date, s.debit, s.credit,
    @b := @b + s.debit - s.credit AS balance
FROM
    (SELECT @b := 0.0) AS dummy 
  CROSS JOIN
    statements AS s
ORDER BY
    stmnt_date ;
Run Code Online (Sandbox Code Playgroud)

使用您的数据,它将导致:

+------------+-------+--------+---------+
| stmnt_date | debit | credit | balance |
+------------+-------+--------+---------+
| 2014-05-15 |  3000 |      0 |    3000 |
| 2014-06-17 | 20000 |      0 |   23000 |
| 2014-07-16 |     0 |   3000 |   20000 |
| 2014-08-14 |     0 |   3000 |   17000 |
| 2015-02-01 |  3000 |      0 |   20000 |
+------------+-------+--------+---------+
5 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)


Tol*_*era 6

我认为您可以尝试以下操作:

set @balance := 0;

SELECT stmnt_date, debit, credit, (@balance := @balance + (debit - credit)) as Balance
FROM statements
ORDER BY stmnt_date;
Run Code Online (Sandbox Code Playgroud)