2013-06-18 162 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