SAS: логика вычитать два числа на основе FIFO - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть проблема, которую мне нужно реализовать с помощью SAS PSQL.Я думал о реализации этого с помощью макросов.

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

Для клиента «А» финансовое учреждение покупает 100 долларов США, 400 долларов США, 500 долларов США, а затем для того же клиента «А» оно продает 350 долларов США. Теперь, начиная с 350 долларов США (учитывая этобыл на хх дате).Мой расчет будет:

USD350 - 100 долларов США = 250 долларов США (это не ноль, поэтому мы переходим к следующему шагу) 250 долларов США - 400 долларов США = -150 долларов США (<0, поэтому мы останавливаемся здесь и записываем это значениевместе с датой, а затем вычислите старение путем вычитания начальной даты продажи и даты этой покупки). </p>

Итак, я предполагаю, что мне приходится перебирать значения, и в настоящее время я не могу этого сделать.Может ли кто-нибудь направить меня к образцу итерации (для цикла)?

Редактировать Мы выполняем это упражнение в конце месяца, чтобы вычислить общий объем неиспользованных запасов. Поэтому на FIFO (First IN First OUT)Исходя из этого, сумма первой продажи должна составлять минус, а сумма первой покупки, основанная на дате покупки для клиента.Любая остаточная сумма первой покупки должна быть перенесена для расчета следующей транзакции продажи (на основе даты покупки). Код указан ниже. Но проблема заключается в ПОКУПКЕ 1-МАРТА-2018, т.е. 100000 не исчерпывается суммой продажи50000 от 18 марта 2018 года и 19 марта 2018 года. Более того, он переходит к следующей сумме покупки, которая составляет 50000 от 02 марта 2018 года.данные хотят;

set sample_2;    
by SECURITY_ID;    
array d{99999} _temporary_;    
array t{99999} _temporary_;    
retain count;

if first.SECUIRTY_ID then do;k=-0;SELL=0;BUY=0;count=0;call missing(of d{*} t{*});end;

if B_S='buy' then do;    
  k+1;    
  d{k}=buy_date;    
  t{k}=stock;    
end;    

if B_S='sell' then do;    
  SELL+stock;FIFO=d{ifn(count=0,1,count)};    
  do i=count+1 to k;    
   BUY+t{i};    
   if SELL lt BUY then do;count=i;leave;end;    
  end;    
end;    

format FIFO date11.;    
REM_QTY = SELL - BUY;    
drop BUY SELL i k count REM_QTY;    
run;

1 Ответ

0 голосов
/ 27 сентября 2018

Вы действительно не объяснили, что вы хотите.Если вы хотите обрабатывать записи по порядку, то используйте обычный шаг DATA.

Давайте сделаем несколько примеров данных.

data have ;
 length client $5 date 8 type $4 amount 8 ;
 input client date type amount ;
 informat date yymmdd.;
 format date yymmdd10.;
cards;
A 2018-03-01 BUY 100
A 2018-03-02 BUY 400
A 2018-03-03 SELL 350
A 2018-03-04 BUY 500
;

Теперь давайте обработаем каждый клиент по порядку.

data want ;
  set have ;
  by client date ;
  if first.client then on_hand =0;
  if type='BUY' then on_hand+amount;
  if type='SELL' then on_hand+-amount;
run;

Результат

Obs    client          date    type    amount    on_hand

 1       A       2018-03-01    BUY       100       100
 2       A       2018-03-02    BUY       400       500
 3       A       2018-03-03    SELL      350       150
 4       A       2018-03-04    BUY       500       650
...