【发布时间】: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?只需使用数据步骤。这将按顺序处理观察结果。
-
如果买卖来自同一个客户,那有什么关系呢?目标是匹配买家和卖家吗?或者也许是为了找到合适的销售基础价值?