SAS - 在 table 名称中使用变量

SAS - Using variable in table name

对 SAS 比较陌生,但我遇到了一个不寻常的问题。我使用一些 proc sql 语句根据最近的月份动态创建一个变量。我想从中检索的 tables 中间有一个月份名称,我想遍历。 例如。图书馆。TABLE_JAN17_ALL 图书馆。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;

以前,我将此逻辑用于 table 名称,其中结尾是 MonthName,即 LIBRARY_TABLEACC_JAN17 -> LIBRARY.TABLEACC_&vMonth。 我对此没有任何问题,但现在变量位于 table 名称的中间,我收到错误消息。 错误:文件库。TABLE_JAN17.DATA 不存在。

如果我使用下面的代码,它工作正常,但我想遍历 120 个月的数据,所以不想单独命名每个月和年。

%Let vMonth2 = JAN17;

proc sql;
create table abc as 
select * from LIBRARY.TABLE_&vMonth2._ALL ;

谁能告诉我问题出在哪里?

谢谢。

有两个可能的问题。最简单的一种是将空格插入到宏变量中。要检验该理论,只需显示值及其周围的值即可。

%put |&vmonth|;

您的 SQL 代码应该使用 TRIMMED 关键字(如果您是 运行 旧版本的 SAS,则使用 SEPARATED BY 关键字代替)来强制 SAS 在制作宏时删除空格变量。

SELECT MonthName into :vMonth trimmed

另一种可能性是 SAS 编译器在看到对象名称中间的宏引用时感到困惑,并错误地将其视为两个或多个标记,即使值中没有实际嵌入的空格也是如此。但这通常只有在宏变量值被宏引用时才会发生。如果您发现该值中没有实际空白,请尝试使用 %unquote() 宏函数。

select * from LIBRARY.%unquote(TABLE_&vMonth._ALL);