Sas 在PROC SQL中使用变量引用列名

Sas 在PROC SQL中使用变量引用列名,sas,Sas,我是SAS的新手,所以请容忍我 我有过去7个月的月度数据。它通过一个PROC TRANSPOSE,这样生成的表就有了名为FEB2015、MAR2015、…、AUG2015的列。这些列将在我重新运行程序的每个月更改,以便在连续几个月的重新运行中,最早的月份从2月到3月等。我希望以后能在节目中提到这个“最早的月份”。例如,我想运行一个PROC SQL,它返回的行在FEB2015列中没有值,但在AUG2015列中的值小于1000,我想这样做是基于以下事实:这些列是以上月和7个月前的月份命名的 下面是我

我是SAS的新手,所以请容忍我

我有过去7个月的月度数据。它通过一个
PROC TRANSPOSE
,这样生成的表就有了名为FEB2015、MAR2015、…、AUG2015的列。这些列将在我重新运行程序的每个月更改,以便在连续几个月的重新运行中,最早的月份从2月到3月等。我希望以后能在节目中提到这个“最早的月份”。例如,我想运行一个
PROC SQL
,它返回的行在FEB2015列中没有值,但在AUG2015列中的值小于1000,我想这样做是基于以下事实:这些列是以上月和7个月前的月份命名的

下面是我试图运行的代码示例。假设该表包含行ID、2015年2月、2015年3月、2015年4月、2015年5月、2015年6月、2015年7月、2015年8月的列,所有整数

%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;
%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;
选择行id、第一行、第二行和最后一行
从mytable
WHERE&first缺失
第二个并没有丢失
和&last<1000;
退出
我认为宏变量中的值只是作为字符串读取,没有被识别为列的名称。我试着用
NLITERAL()
将它们包装起来,但运气不好


谢谢

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

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