【问题标题】:maintaning opening and closing balance for each row in a ledger table维护分类帐表中每一行的期初余额和期末余额
【发布时间】:2012-05-06 14:45:23
【问题描述】:

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

【问题讨论】:

    标签: php mysql sql accounting


    【解决方案1】:

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

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

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

    如果您真的想避免在查询中使用 SUM()(尽管我不确定为什么),另一种方法是向该表添加额外的字段,以保留历史余额和当前余额。但是,这种方法仅限于单一的历史余额。

    此外,在查询中使用 SUM() 来获取当前余额应该不是问题,即使在大型表或数据库中也是如此,除非我在这里遗漏了什么。

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

    【讨论】:

    • SUM 查询需要多少行才能对其性能产生影响?这是我在不久的将来唯一关心的问题。 :)。我也更新了问题。如果我使用 SUM,我想要这样的结果。谢谢
    • 我不认为对性能有“影响”,因为太多的记录不会因为算法问题而减慢速度。据我所知,它只会随着您汇总的记录数量线性减慢。数以万计的记录应该在几秒钟之内。我见过 5 或 600 万条记录的报告只需要 20 秒左右。真正的问题是您的表格设计得如何以及您要求查询完成的其他事情。
    • 好的。知道了。那么上面的例子能不能生成sql查询动态获取期初和期末余额呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多