我有下表有一个交易清单
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)
有什么想法吗?
提前致谢。
詹姆斯
答案 0 :(得分:6)
简单的总和
select SUM(Amount) from
(
select Amount from #t where ToID=@user
union all
select -Amount from #t where FromID=@user
) v
(你可以在一行中做到......
select sum(case @user when ToID then Amount else -Amount end)
from #t where @user in (ToID, FromID)
但我认为工会会更有效率)
答案 1 :(得分:1)
“最佳”方式是主观的。最有效的方法可能是在您的用户表中添加一个余额字段,然后在您为该用户进行交易时适当地更新该字段。
[编辑]澄清:
在插入事务行的代码中,在事务中添加更新查询:
BEGIN TRANSACTION;
INSERT INTO transactions VALUES (...);
UPDATE users SET balance = balance + <whatever the change is>;
COMMIT TRANSACTION;
然后您的余额检查变为:
SELECT balance FROM users WHERE id = '...';
它被索引,非常快,并且只需要考虑一行。如果您依赖于事务表的有效求和,那么当您添加事务时,您的余额检查查询将变得更慢。
答案 2 :(得分:0)
SUM两组金额(SUM给予用户的所有金额以及SUM给出的所有金额) - 减去两项(如果使用SQL Server,则可以使用( - )SUBTRACT)