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

Смежные вопросы