tbl_transaction:
Sender Receiver Amount Date
1102504637 31750690083 50 03/04/2013
1102504637 31750690083 50 04/04/2013
1102504637 31750690083 50 06/04/2013
1102504637 31750690083 50 07/04/2013
1102504637 31750690083 50 09/04/2013
1102504637 31750690083 50 10/04/2013
1102512397 31811645749 200 24/04/2013
1102512397 31811645749 200 01/04/2013
1102185152 31823355218 100 14/04/2013
1102185152 31823355218 100 22/04/2013
1102185152 31823355218 100 23/04/2013
我希望得到基于发送者的结果,发送者最多可以向同一个接收者发送200个(根据最早的日期/第一个发送到200的结果将到达结果列表)。
我想知道有多少人在进行50x4,100x2,200x1交易。因此,只有发送金额总和为200的发件人才会在结果列表中。我正在使用SQL Server 2005。
示例结果:
Sender Receiver Amount count
1102504637 31750690083 50 4
1102512397 31811645749 200 1
1102185152 31823355218 100 2
答案 0 :(得分:1)
您需要累计金额。这个想法很简单;只需选择累积和小于或等于200的行。
SQL Server 2005没有内置累积总和(SQL Server 2012)。在这种情况下,我倾向于使用相关子查询:
select sender, receiver, amount, count(*)
from (select t.*,
(select sum(t2.amount)
from t t2
where t2.sender = t.sender and
t2.receiver = t2.receiver and
t2.date <= t.date
) as cumAmount
from t
) t
where cumAmount <= 200
group by sender, receiver, amount
注意:在您的示例中,给定对的金额都是相同的。如果它们不同,则此查询将列出不同行上每对的所有金额。
答案 1 :(得分:1)
由于您使用的是SQL Server 2005,因此可以使用CROSS APPLY
查询来获取运行总和:
select t.sender, t.receiver,
t.amount, c.Total
from tbl_transaction t
cross apply
(
select count(*) total
from tbl_transaction t1
where t.sender = t1.sender
and t.receiver = t1.receiver
and t.date <= t1.date
having sum(amount) = 200
) c;