0

この質問には複数のバリエーションがあることは知っていますが、この形式ではありません。私の元帳テーブルには、基本的な形式で次の列があります。

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

DateOfEntry は、トランザクションの挿入時刻を格納する列です。TransactionDate は、手動で入力できるトランザクションの日付のみを格納します。多くのトランザクションは同じ TransactionDate を持つことができるため、ASC をこの順序で並べ替えます TransactionDate、DateOfEntrydate、TransactionID

各行の以前と最終のバランスを維持したい (挿入、削除、または編集時)。残高をさかのぼって知ることができる必要があるため、お勧めできないことはわかっていますが、これらの残高を保存しています。最後の決算残高。

現在の日付のトランザクションを挿入するためにこれを行うことは問題ありません。そのクライアントの最後のレコードを確認し、新しい開始残高としてその終了残高を取得することで簡単に実行できます。

トランザクションを編集、削除、または新しい「過去の」トランザクションを挿入するときに問題があります。その下にある行のバランスを挿入および更新する場所をどのように知ることができますか? これは、SQL クエリだけでは不可能であることを知っています。

今回は、これを行うための最良の方法を知りたいだけです。

多くの人は、日付 A の前に期首残高を取得するために、日付 A の前に金額の SUM() を使用する必要があることを提案しています (最初に借方か貸方かを確認します)。(現在これを行っていますが、残高を保存するように変更したい)

何か提案はありますか?

更新 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

それで、トランザクションがそれ以降に削除または編集された可能性がある場合でも、いつでも残高が何であったかを知りたいですか?もしそうなら、いくつかの可能なアプローチがあります。

1つは、履歴残高を同じテーブルに保存するのではなく、別のテーブルを保持することです。この他のテーブルには、日付とその日付の残高が格納されます。現在の残高はクエリで計算できます。

別のアプローチは、テーブルをそのままにしておくことです。ただし、この場合、残高フィールドを使用して、過去の残高のみを維持します。ここでも、現在の残高をクエリで計算できます。

別のアプローチとして、クエリでSUM()を使用することを本当に避けたい場合は(理由はわかりませんが)、履歴と現在の両方のバランスを維持するフィールドをこのテーブルに追加することです。ただし、このアプローチは、単一の履歴バランスに限定されます。

また、クエリでSUM()を使用して現在の残高を取得することは、大きなテーブルやデータベースであっても、ここで何かが不足している場合を除いて、実際には問題にはなりません。

あなたの質問を誤解した場合はお知らせください。

于 2012-05-06T15:02:37.950 に答える