2012-05-06 21 views
0

我知道这里存在多种此问题的变体,但不以此形式。基本表格中的My Ledger表格具有以下列。总帐表中每一行的主要开始和结束余额

TransactionID | DateOfEntrydate | TransactionDate | ClientID | TrIsDebit | OpeningBalance | Amount | ClosingBalance 

DateOfEntry是存储事务插入时间的列。 TransactionDate商店仅可手动输入的交易日期,许多事务可以有相同的TransactionDate所以我在这个顺序TransactionDate,DateOfEntrydate排序ASC,TransactionID的

我想保持以前和最终余额为每一行(插入,删除或编辑)。即使我知道这是不可取的,我仍然存储这些余额,因为我需要能够回顾性地了解余额,即我能够知道从A日至B日的交易以及每次交易后我的余额总是给我最后期末余额。

这样做是为了插入当前日期的交易是可以的,可以通过检查该客户的最后一笔记录并将其余额作为新的期初余额轻松完成。

我有一个问题,当我编辑,删除一个交易或插入一个新的“倒退日期”交易。我如何知道在哪个位置插入并更新下方行的余额?我知道这仅仅是SQL查询所不可能的。

这次我只是想知道最好的方法来做到这一点。

许多人建议我应该在日期A之前使用SUM()的金额(通过首先检查其借记卡或信用卡),以便在日期A之前获得我的期初余额,但这不是可取的表格非常大。 (目前我正在这样做,但想要将其更改为存储余额)

任何建议家伙?

UPDATE 我也想知道如果我用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 

回答

0

所以,你要能够知道什么是余额为在任何给定时间,即使交易可能已被删除或自然后进行编辑?如果是这样,有几种可能的方法。

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

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

另一种方法,如果你真的想在你的查询中避免使用SUM()(尽管我不知道为什么),那么会在表中添加额外的字段,以保持历史和当前的平衡。然而,这种方法将仅限于单一的历史平衡。

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

如果我误解了你的问题,请让我知道。

+0

需要多少行SUM查询才能对其性能产生影响?这是我在不久的将来唯一关心的问题。 :)。我也更新了这个问题。如果我使用SUM,我想要那样的结果。谢谢 – karanits

+0

我不认为会对性能产生任何“影响”,因为太多的记录不会因为算法问题而减慢速度。据我所知,它只会随着你正在求和的记录数而线性减速。成千上万的记录应该在几秒钟内。我见过只有20秒左右的5,600万条记录。真正的问题是你的表格设计得有多好,以及你要求查询完成的其他事情。 –

+0

好的。得到它了。那么你可以生成sql查询来动态获得上述例子的开盘和收盘余额吗? – karanits