查询 - 按最大金额分组

时间:2013-06-18 10:05:38

标签: sql sql-server sql-server-2005

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

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;

请参阅SQL Fiddle with Demo