需要在和计算中使一些值为负

时间:2012-07-19 14:29:19

标签: sql sql-server sql-server-2008

我有下表有一个交易清单

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)

有什么想法吗?

提前致谢。

詹姆斯

3 个答案:

答案 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)