我正在学习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定义为字符和数字。
请取悦我。非常感谢。
SAS将在首次引用该变量时创建该变量。在您的程序中,此行中第一个引用QTRNUM的地方。
call missing(qtrnum, amt2);
SAS无法确定QTRNUM是数字还是字符,因此将其设为数字。
您实际上并不需要该行,所以为什么不删除它。
确保变量首先被定义的一种方法是在数据步骤的顶部包含这样的一行。
if 0 then set contrib;
由于0为假,所以从不执行SET语句,但是在数据步骤的编译过程中,SAS将在CONTRIB中定义所有变量。
也明确定义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;