【发布时间】:2018-03-26 18:59:44
【问题描述】:
我有以下代码来跟踪特定制造商优惠券的发行。每个问题都可以在已赎回、过期和剩余字段中包含美元。我有一个 ISSUE 表,它给出了所有的发行和金额,还有一个 REDEMPTIONS 表,它记录了赎回或过期的金额。目标是通过在每个类别中放置适当的金额来跟踪每个问题的所有票面金额。
此代码应该循环遍历 ISSUE 表,并将 REDEMPTIONS 表中的匹配记录与 ISSUE 表中的每条记录联系起来。
/*create sample tables*/
data ISSUE; input
Coupon_NBR $ AMOUNT REDEEMED EXPIRED REMAINING; datalines;
A 500 0 0 500
A 500 0 0 500
B 500 0 0 500
B 500 0 0 500
B 500 0 0 500
B 1250 0 0 1250
B 750 0 0 750
C 500 0 0 500
C 500 0 0 500
C 500 0 0 500
C 500 0 0 500
C 500 0 0 500
run;
data REDEMPTIONS; input
Redemp_coupon_NBR $ TRANS_AMOUNT TYPE $16.; datalines;
A -150 REDEMPTION
A -350 REDEMPTION
A -200 EXPIRATION
B -300 REDEMPTION
B -200 EXPIRATION
B -1000 REDEMPTION
C -1500 REDEMPTION
C -500 EXPIRATION
run;
/*begin looping code*/
data Tracking;
if _n_ = 1 then Link get_redemptions;
set issue;
if (remaining > 0) and (Coupon_NBR = Redemp_coupon_NBR) then do;
if trans_amount = 0 then
link get_redemptions;
if trans_amount + remaining >=0 then do;
remaining = remaining + trans_amount;
if type = 'EXPIRATION' then;
expired = expired - trans_amount;
if type = 'REDEMPTION' then;
redeemed = redeemed - trans_amount;
link get_redemptions;
end;
else do;
remaining = 0;
if type = 'EXPIRATION' then do;
expired = expired - trans_amount;
end;
else do;
redeemed = redeemed - trans_amount;
trans_amount = trans_amount + remaining;
remaining = 0;
end;
end;
end;
else do;
link get_redemptions;
end;
return;
get_redemptions:
set redemptions;
return;
run;
这是我得到的输出:
Coupon_NBR AMOUNT REDEEMED EXPIRED REMAINING redemp_coupon_nbr trans_amount type
A 500 150 150 350 A -350 REDEMPTION
A 500 350 350 150 A -200 EXPIRATION
B 500 0 0 500 B -300 REDEMPTION
B 500 300 300 200 B -200 EXPIRATION
B 500 200 200 300 B -1000 REDEMPTION
B 1250 1000 1000 250 C -1500 REDEMPTION
B 750 0 0 750 C -500 EXPIRATION
在这个例子中,正确的输出是:
redemp_coupon_nbr AMOUNT REDEEMED EXPIRED REMAINING
A 500 500 0 0
A 500 0 200 300
B 500 300 200 0
B 500 500 0 0
B 500 500 0 0
B 1250 0 0 1250
B 750 0 0 750
C 500 500 0 0
C 500 500 0 0
C 500 500 0 0
C 500 0 500 0
C 500 0 0 500
显然,我的结果与我想要的结果相去甚远。然而,我主要担心的是输出只有七行,当我希望它跟踪每个优惠券问题时,这意味着我需要它有 12 行(对于 ISSUE 表中的每一行)。我认为我的循环存在某种问题,特别是在Get Redemptions 定义中。我调试了一段时间没有成功。
【问题讨论】:
-
如果您没有任何
output语句,那么 SAS 将在数据步迭代结束时输出。听起来您的数据步骤仅迭代 7 次。您只需要在准备好后显式输出观察结果。 -
大多数数据步骤会在您读取输入结束时停止。在处理完
issue中的所有记录之前,您无需阅读到redemptions的末尾。 -
您的输出并不能说明全部情况,尤其是在第 3 个 B 中,1000 兑换适用于 500 的优惠券,这意味着有 500 的兑换余额(在以后的优惠券中使用)。我认为一般来说你不想允许超过优惠券的赎回。您将需要相当数量的脚手架,以允许旋转赎回或优惠券。 “脚手架”将是当前余额、赎回和、到期和赎回余额以及到期余额的变量