我是SAS的新手,请耐心等待。
我有过去7个月的月度数据。它通过PROC TRANSPOSE
,使得结果表具有名为FEB2015,MAR2015,...,AUG2015的列。这些列将在每个月更改我重新运行我的程序,以便最早的月份将从2月到3月等,在连续几个月的重播中。我希望以后能够在该计划中引用这个“最早的月份”。例如,我想运行一个PROC SQL
,返回FEB2015列中没有值但在AUG2015列中的值小于1000的行,我想根据列的事实来执行此操作以上个月和7个月前的月份命名。
以下是我要尝试运行的代码示例。假设该表的列为row_ID,FEB2015,MAR2015,APR2015,MAY2015,JUN2015,JUL2015,AUG2015,所有整数。
%let first = put(intnx('month',today(),-7,'begin'), MONYY7.);
%let second = put(intnx('month',today(),-6,'begin'), MONYY7.);
%let last = put(intnx('month',today(),-1,'begin'), MONYY7.);
PROC SQL noprint;
SELECT row_id, &first, &second, &last
FROM mytable
WHERE &first is missing
and &second is not missing
and &last < 1000;
QUIT;
我认为宏变量中的值只是作为字符串读取而不被识别为列的名称。我已经尝试将它们包裹在NLITERAL()
但没有运气。
谢谢!
答案 0 :(得分:0)
当然,宏变量值是字符串。宏变量值总是字符串。问题是你的字符串不是变量的有效名称。变量名称中不能包含括号或引号。如果要在宏代码中调用函数,则需要将调用嵌套在%SYSFUNC()宏函数内。
%let first = %sysfunc(intnx(month,%sysfunc(today()),-7,begin), MONYY7.);