У меня есть проблема, которую мне нужно реализовать с помощью 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;