大家好,感谢您的帮助。
我有以下情况:一个名为 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)
我认为您可以尝试以下操作:
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)
归档时间: |
|
查看次数: |
57421 次 |
最近记录: |