SAS相对较新,但我遇到了一个不寻常的问题。我使用一些proc sql语句根据最近一个月动态创建变量。我想要检索的表在它们中间有一个月份名称,我想循环。 例如。 LIBRARY.TABLE_JAN17_ALL LIBRARY.TABLE_DEC16_ALL等。
示例代码:
DATA qtrMonth;
INPUT vDay vMonth vMonthName $;
DATALINES;
31 01 JAN
28 02 FEB
31 03 MAR
30 04 APR
31 05 MAY
30 06 JUN
31 07 JUL
31 08 AUG
30 09 SEP
31 10 OCT
30 11 NOV
31 12 DEC
;
DATA year;
INPUT vYear ;
DATALINES;
14
15
16
17
;
run;
/* Next step is to do a cartesian join to populate
all possible Month & Year combos in the dataset */
PROC SQL;
create table popCalendar as
SELECT
mdy(a.vMonth,a.vDay, b.vYear) as MyDate format DATE9.
,CAT(TRIM(a.vMonthName), b.vYear) as MonthName
FROM qtrMonth a
CROSS JOIN year b
;
quit;
PROC SQL;
create table tmpMax as
Select Max(MyDate) as MaxDate
FROM popCalendar
WHERE MyDate < today();
/*select max monthName into vMonth variable */
SELECT trim(MonthName) into :vMonth
FROM popCalendar a
inner join tmpMAX b on a.MyDate = b.MaxDate;
quit;
/*Select from table using variable*/
proc sql;
create table abc as
select * from LIBRARY.TABLE_&vMonth._ALL;
以前,我将此逻辑用于表名,其中结尾是MonthName,即LIBRARY_TABLEACC_JAN17 - &gt; LIBRARY.TABLEACC_和放大器; vMonth。 我对此没有任何问题,但现在变量位于表名的中间,我得到一个错误。 错误:文件LIBRARY.TABLE_JAN17.DATA不存在。
如果我使用以下代码,它可以正常工作,但我想循环使用120个月的数据,所以不要每个月都单独命名。年。
%Let vMonth2 = JAN17;
proc sql;
create table abc as
select * from LIBRARY.TABLE_&vMonth2._ALL ;
有人可以建议问题是什么吗?
感谢。
答案 0 :(得分:0)
有两个可能的问题。最简单的是你在空变量中插入空格。为了测试这个理论,只需用它周围的东西显示价值。
%put |&vmonth|;
您的SQL代码应该使用TRIMMED关键字(如果您运行旧版本的SAS使用SEPARATED BY关键字),则强制SAS在创建宏变量时删除空白。
SELECT MonthName into :vMonth trimmed
另一种可能性是SAS编译器在对象名称的中间看到宏引用而感到困惑,并且即使在值中没有实际的嵌入空格,也错误地将其视为两个或更多令牌。但这通常只在宏变量值被宏引用时才会发生。如果您看到该值中没有实际空白,请尝试使用%unquote()
宏函数。
select * from LIBRARY.%unquote(TABLE_&vMonth._ALL);