2012-05-06 54 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