我知道这个问题在这里有多种变体,但不是这种形式。My Ledger 表在基本形式中具有以下列。
TransactionID | DateOfEntrydate | TransactionDate | ClientID | TrIsDebit | OpeningBalance | Amount | ClosingBalance
DateOfEntry 是存储事务插入时间的列。TransactionDate 仅存储可以手动输入的交易日期,许多交易可以具有相同的 TransactionDate 所以我按 TransactionDate、DateOfEntrydate、TransactionID 的顺序对 ASC 进行排序
我想维护每一行的先前和最终余额(插入、删除或编辑)。即使我知道这是不可取的,我仍在存储这些余额,因为我需要能够回顾性了解余额,即我能够知道我从日期 A 到日期 B 的交易以及每次交易后的期末余额总是给我最后期末余额。
插入当前日期的交易是可以的,并且可以通过检查该客户的最后一条记录并将其期末余额作为新的期初余额轻松完成。
我有一个问题是当我编辑、删除交易或插入新的“回溯”交易时。我如何知道在哪个位置插入和更新其下方行的余额?我知道单独使用 SQL 查询是不可能的。
这次我只想知道最好的方法来做到这一点。
许多人建议我应该在日期 A 之前使用金额的 SUM()(首先检查它是借方还是贷方)来获得日期 A 之前的期初余额,但这对于可能非常大的表来说是不可取的。(目前我正在这样做,但想将其更改为存储余额)
有什么建议吗?
更新我还想知道我是否使用 SUM(),在客户的每次交易后动态生成期初余额和期末余额的最佳方法是什么,而不是将其存储在表中以获取示例数据
TransactionID | DateOfEntrydate | TransactionDate | ClientID | TrIsDebit | Amount
225 | 2012-05-06 18:20:10| 2012-03-01 | 360 | 0 | 100
219 | 2012-05-06 18:09:16| 2012-03-31 | 360 | 1 | 1000
224 | 2012-05-06 18:19:49| 2012-03-31 | 360 | 0 | 100
218 | 2012-05-06 18:08:09| 2012-04-30 | 360 | 1 | 1000
221 | 2012-05-06 18:17:55| 2012-04-30 | 360 | 1 | 1000
222 | 2012-05-06 18:18:58| 2012-04-30 | 360 | 0 | 500
220 | 2012-05-06 18:17:10| 2012-05-01 | 360 | 1 | 1000
223 | 2012-05-06 18:19:28| 2012-05-01 | 360 | 0 | 500
显示为
TransactionID | DateOfEntrydate | TransactionDate | ClientID | TrIsDebit | "dynamicOpeningBalance" | Amount | "dynamicClosingBalance"
225 | 2012-05-06 18:20:10| 2012-03-01 | 360 | 0 | 0 | 100 |-100
219 | 2012-05-06 18:09:16| 2012-03-31 | 360 | 1 | -100 | 1000 | 900
224 | 2012-05-06 18:19:49| 2012-03-31 | 360 | 0 | 900 | 100 | 800
218 | 2012-05-06 18:08:09| 2012-04-30 | 360 | 1 | 800 | 1000 |1800
221 | 2012-05-06 18:17:55| 2012-04-30 | 360 | 1 | 1800 | 1000 |2800
222 | 2012-05-06 18:18:58| 2012-04-30 | 360 | 0 | 2800 | 500 |2300
220 | 2012-05-06 18:17:10| 2012-05-01 | 360 | 1 | 2300 | 1000 |3300
223 | 2012-05-06 18:19:28| 2012-05-01 | 360 | 0 | 3300 | 500 |2800