2013-06-18 95 views
-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 

回答

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 

注:在你的榜样,金额是一对给定都是一样的。如果它们不同,那么此查询将列出不同行上每对的所有金额。

+0

@tombom。 。 。谢谢。 –

+0

嗨,实际上我为此使用了2个表格,因为金额列在另一个表格上。怎么做?谢谢。 – andresk

+0

@andresk。 。 。您需要在每个'from'语句中加入这些信息。 –

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

+0

嗨,尝试后,我得到我想要的,但金额= 100x3,50x3其他交易也列入清单。有什么办法可以消除这种情况吗?我只想得到发送金额为200的人的结果。谢谢你的帮助。 – andresk

+0

@andresk你可以用额外的数据编辑sql提琴吗? – Taryn

+0

嗨,金额列存在于其他表,如果我想使用这种方法我应该在哪里加入两个表?谢谢。 – andresk