【问题标题】:SAS: Logic to subtract two numbers on FIFO basisSAS:在 FIFO 基础上减去两个数字的逻辑
【发布时间】:2018-09-26 16:02:06
【问题描述】:

我有一个问题需要使用 SAS PSQL 来实现。我曾想过使用宏来实现它。

我将尝试将我的问题分解为多个阶段。在第一阶段,我对如何迭代访问每个单元格值的行感到震惊,并对这些值进行一些操作和计算。一个例子是:

金融机构为客户“A”买入 100 美元、400 美元、500 美元,然后为同一客户“A”卖出 350 美元。现在从 350 美元开始(假设是在 xx 日)。我的计算是:

350 美元 - 100 美元 = 250 美元(不是零,所以我们继续下一步) 250 美元 - 400 美元 = -150 美元(

所以我猜我必须迭代值,但我目前无法这样做。有人可以指导我进行迭代示例(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;

【问题讨论】:

  • 欢迎来到 SO。你对这个问题有一些问题 - 不要在文本中使用全部大写,这相当于在互联网上对人们大喊大叫。此外,您不清楚如何从一个输入到另一个输入的逻辑。我建议编辑您的问题以将其简化为一个问题,并明确显示您拥有什么、您想要什么、到达那里的逻辑以及您尝试过的内容。然后你会很快得到回复。
  • 您真的是要匹配它们还是只是按顺序处理它们?您每天有超过一笔交易吗?如果是,您想如何在当天订购。这与 BUY 表示加,SELL 表示减的计算总和有什么不同?
  • 我的意思是:例如,如果我为客户“A”购买了 4 次 - 100,200,300,400 美元和 1 次销售 350 美元。现在我的逻辑应该继续计算买卖之间的差异,直到我得到0 或购买已完成(对于该特定客户)。而且我必须以先进先出的方式从购买中减去销售。 350-100 = 200 然后 200-200 = 0(停止)。我的主要问题是如何迭代行来执行这些计算。
  • 为什么要使用 SQL?只需使用数据步骤。这将按顺序处理观察结果。
  • 如果买卖来自同一个客户,那有什么关系呢?目标是匹配买家和卖家吗?或者也许是为了找到合适的销售基础价值?

标签: sas proc step


【解决方案1】:

你还没有真正解释你想要什么。如果您想按顺序处理记录,请使用普通的 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

【讨论】:

  • 请检查下面的答案。我无法在 cmets 中发布图片,所以我不得不将其发布为答案
猜你喜欢
  • 2021-10-11
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多