2016-11-07 3 views
0

фонСумма сделок между различными датами

У меня есть таблица, содержащая операции. Существует два типа транзакций: «обычные записи» (тип = N) и записи «fix» (тип = F). Каждая транзакция имеет идентификатор клиента, дату, код типа и сумму евро. Ниже приведены некоторые примерные данные:

| client_id | date | transaction_type | amount | 
|-----------|-----------|------------------|---------| 
|  111 | 01jan2015 | N    | 1000.0 | 
|  111 | 01jan2015 | F    | -500.0 | 
|  222 | 05mar2015 | N    | 2000.0 | 
|  222 | 06mar2015 | F    | -100.0 | 
|  222 | 07mar2015 | F    | -100.0 | 
|  222 | 09mar2015 | N    | 1000.0 | 
|  222 | 10mar2015 | N    | 400.0 | 
|  222 | 15jun2015 | F    | -200.0 | 

Записи исправлений являются ручными исправлениями для обычных транзакций, совершенных кем-либо из регистра. Они могут быть выполнены в тот же день или после обычной транзакции, но если для одного и того же клиента введена новая нормальная транзакция, все последующие исправления этого клиента относятся к новой транзакции (пока не будет введена еще одна нормальная транзакция). Фактически, все исправления «фиксируют» только последнюю транзакцию этого клиента.

Исправления могут быть положительными или отрицательными, обычные транзакции положительны.

Желаемая выход

То, что я хочу, это набор «нормальных» сделок на клиент, с количеством суммы скорректированного всех исправлениями, связанных с этой сделкой. Пример ниже данные:

| client_id | date | amount | 
|-----------|-----------|--------| 
|  111 | 01jan2015 | 500.0 | 
|  222 | 05mar2015 | 1800.0 | 
|  222 | 07mar2015 | 1000.0 | 
|  222 | 08mar2015 | 200.0 | 

Так что это сумма одной транзакции типа N и всех последовательных F-транзакций вплоть до следующего N-транзакции.

То, что я до сих пор

Если все исправления происходят на ту же дату первоначальной сделки (как это обычно бывает), это очень просто:

select client_id, date, sum(amount) 
from transaction_table 
group by client_id, date 

Однако, У меня возникли проблемы с исправлениями, которые произойдут после исходной даты транзакции, потому что мне нужно выбрать только те, которые происходят до следующей обычной транзакции (и это нужно применять для каждой обычной транзакции).

записку о продуктах в использовании

Я на самом деле с помощью SAS 9.4, но через процедуру прок SQL SAS, я могу применять основные SQL, и это то, что я более комфортно, используя. Ничего особенного (поэтому курсоры, CTE и т. Д.). Хороший ответ SAS тоже будет принят!

+1

Курсоры доступны в SAS SQL. – Reeza

+0

Можете ли вы предположить, что представленный вами заказ будет присутствовать или должен быть учтен в решении? – Reeza

+0

Да, порядок строк может считаться таковым. Спасибо за курсор, я этого не знал. –

ответ

0

Создайте флаг группировки, который устанавливается при каждом N. Что произойдет, если в тот же день несколько покупок?

Data want; 
    Set have; 
    By ID; 
    Retain purchaseGroup; 
    If transx = 'N' then purchaseGroup+1; 
    If first.id then purchaseGroup=1; 
Run; 

Затем суммируйте, используя группировку по шагам SQL по ID и PurchaseGroup.

+0

Вы делаете очень хороший момент о нескольких покупках в тот же день. Похоже, что это возможно, но в отношении фактического использования этих данных не будет иметь значения, если однотипные N-транзакции суммируются или нет (то есть я могу жить с обеими альтернативами). –

+0

Это будет группировать каждую покупку в свою группу. – Reeza

+0

Ваш идентификатор: Это просто client_ID или вы имеете в виду как client_ID, так и дату? –

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