我知道这里存在多种此问题的变体,但不以此形式。基本表格中的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
需要多少行SUM查询才能对其性能产生影响?这是我在不久的将来唯一关心的问题。 :)。我也更新了这个问题。如果我使用SUM,我想要那样的结果。谢谢 – karanits
我不认为会对性能产生任何“影响”,因为太多的记录不会因为算法问题而减慢速度。据我所知,它只会随着你正在求和的记录数而线性减速。成千上万的记录应该在几秒钟内。我见过只有20秒左右的5,600万条记录。真正的问题是你的表格设计得有多好,以及你要求查询完成的其他事情。 –
好的。得到它了。那么你可以生成sql查询来动态获得上述例子的开盘和收盘余额吗? – karanits