-1

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
4

2 回答 2

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;

请参阅带有演示的 SQL Fiddle

于 2013-06-18T10:41:03.177 回答
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

注意:在您的示例中,给定对的金额都是相同的。如果它们不同,则此查询将在不同行上列出每对的所有金额。

于 2013-06-18T10:37:54.413 回答