我有一个需要使用 SAS PSQL 实现的问题。我曾想过使用宏来实现它。
我将尝试将我的问题分解为多个阶段。在第一阶段,我对如何迭代访问每个单元格值的行感到震惊,并对这些值进行一些操作和计算。一个例子是:
对于客户“A”,金融机构购买 100 美元、400 美元、500 美元,然后对于同一个客户“A”,它卖出 350 美元。现在从 350 美元开始(考虑到它是在 xx 日期)。我的计算是:
350 美元 - 100 美元 = 250 美元(它不是零,所以我们继续下一步) 250 美元 - 400 美元 = -150 美元(<0 所以我们在此停止并将此值与日期一起记录,然后通过减去开始计算帐龄销售日期和本次购买日期)。
所以我猜我必须迭代值,而我目前无法这样做。有人可以指导我进行迭代样本(For循环)吗?
编辑 我们在月底做这个练习来计算未使用的总库存。因此,在 FIFO(先进先出)的基础上,首先卖出的金额应该减去基于客户的 buy_date 的第一次买入金额。第一次购买的任何剩余金额将结转用于计算下一次卖出交易(基于买入日期)。代码如下。但问题是 2018 年 3 月 1 日的买入,即 100000 没有被卖出金额耗尽2018 年 3 月 18 日和 2018 年 3 月 19 日的 50000。相反,它正在继续下一个购买量,即 2018 年 3 月 2 日的 50000。数据需要;
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;