0

私はトランザクションのリストを持っている次の表を持っています

ID  FromID   ToId      AMOUNT
1   1        2         10
2   1        3         10
4   1        4         10
5   3        2         3
6   4        2         2
7   4        2         1
8   2        4         2

ユーザーのバランスをとるための最良/最も効率的な方法を知りたいです。残高は、ユーザーに与えられた金額の合計(IDはToId)からユーザーに与えられた金額の合計(IDはFromId)を引いたものになります。

何か案は?

前もって感謝します。

ジェームズ

4

3 に答える 3

6

簡単な合計で

select SUM(Amount) from
(
select Amount from #t where ToID=@user
union all
select -Amount from #t where FromID=@user
) v

(1行で実行できます...

select sum(case @user when ToID then Amount else -Amount end) 
from #t where @user in (ToID, FromID)

しかし、私は組合がより効率的だと思います)

于 2012-07-19T14:35:15.880 に答える
1

「最良の」方法は主観的です。最も効率的な方法は、おそらくユーザーテーブルに残高フィールドを追加し、そのユーザーのトランザクションがあるたびにそれを適切に更新することです。

[編集]明確にするために:

トランザクション行を挿入するコードで、トランザクション内に更新クエリを追加します。

BEGIN TRANSACTION;
INSERT INTO transactions VALUES (...);
UPDATE users SET balance = balance + <whatever the change is>;
COMMIT TRANSACTION;

次に、バランスチェックは次のようになります。

SELECT balance FROM users WHERE id = '...';

インデックスが作成され、非常に高速で、1行のみを考慮する必要があります。トランザクションテーブルのアクティブな合計に依存している場合、トランザクションを追加すると、バランスチェッククエリの速度が遅くなります。

于 2012-07-19T14:36:24.197 に答える
0

2セットの金額を合計します(ユーザーに与えられたすべての金額を合計し、与えられたすべての金額を合計します)-2つを減算します(SQL Serverを使用している場合は、(-)SUBTRACTを使用できます)

于 2012-07-19T14:36:17.867 に答える