我正在 sas 学习哈希对象,我想跟踪销售业绩和目标之间的差异。我将id,qtrnum和amt属于销售额。
销售数据集如下:
data contrib;
input id $ qtrnum $ amt;
datalines;
a001 atr1 12
a001 atr2 13
a002 atr1 11
a002 atr2 18
;
run;
并且目标位于哈希对象中:
data difference (drop = amt2);
length amt2 8;
if _n_ = 1 then do;
declare hash goal();
goal.definekey("Qtrnum");
goal.definedata("Amt2");
goal.definedone();
call missing(qtrnum, amt2);
goal.add(key:'atr1', data:9);
goal.add(key:'atr2', data:13);
end;
set contrib;
goal.find();
diff = amt - amt2;
run;
虽然它给出了错误:
错误:变量qtrnum已被定义为字符和数字。
请取悦我。非常感谢。
答案 0 :(得分:2)
SAS将在第一次引用变量时创建变量。在你的程序中,第一次引用QTRNUM就在这一行。
goal.definekey("Qtrnum");
SAS无法判断QTRNUM是数字还是字符,因此它使其成为数字。这就是为什么在许多使用散列对象的DATA步骤中,数据步骤的顶部会有这样的行。
if 0 then set contrib;
由于0为假,因此从不执行SET语句,但在编译数据步骤期间,SAS将定义CONTRIB中的所有变量。
答案 1 :(得分:0)
也明确定义Qtrnum变量。
length Qtrnum $8;
或者可能看起来像:
data difference (drop = amt2);
length amt2 8 Qtrnum$8;
if _n_ = 1 then do;
declare hash goal();
goal.definekey("Qtrnum");
goal.definedata("Amt2");
goal.definedone();
call missing(qtrnum, amt2);
goal.add(key:'atr1', data:9);
goal.add(key:'atr2', data:13);
end;
set contrib;
goal.find();
diff = amt - amt2;
run;