0

我知道这个问题在这里有多种变体,但不是这种形式。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
4

1 回答 1

1

因此,即使交易可能从那时起已被删除或编辑,您也希望能够知道在任何给定时间的余额是多少?如果是这样,有几种可能的方法。

一种是保留一个单独的历史余额表,而不是将它们存储在同一个表中。该另一个表将存储日期和截至该日期的余额。当前余额可以在查询中计算。

另一种方法可能是保持原样。但是,在这种情况下,仅使用余额字段来维护历史余额。再次,可以在查询中计算当前余额。

另一种方法,如果你真的想避免在查询中使用 SUM() (虽然我不确定为什么),那就是在这个表中添加额外的字段来保持历史和当前的余额。然而,这种方法将仅限于单一的历史平衡。

此外,即使在大型表或数据库中,在查询中使用 SUM() 来获取当前余额也不应该是一个真正的问题,除非我在这里遗漏了一些东西。

如果我误解了你的问题,请告诉我。

于 2012-05-06T15:02:37.950 回答