-5

我有一个需要使用 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;
4

1 回答 1

0

你还没有真正解释你想要什么。如果您想按顺序处理记录,请使用正常的 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
于 2018-09-27T20:22:11.773 回答