在PROC SQL

时间:2015-09-02 23:28:37

标签: sas

我是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()但没有运气。

谢谢!

1 个答案:

答案 0 :(得分:0)

当然,宏变量值是字符串。宏变量值总是字符串。问题是你的字符串不是变量的有效名称。变量名称中不能包含括号或引号。如果要在宏代码中调用函数,则需要将调用嵌套在%SYSFUNC()宏函数内。

%let first = %sysfunc(intnx(month,%sysfunc(today()),-7,begin), MONYY7.);