2017-02-23 152 views
0

SAS比较新,但遇到了一个不寻常的问题。我使用一些proc sql语句来动态创建基于最新月份的变量。我想要检索的表格在它们中间有一个月份名称,我想循环浏览。 例如LIBRARY.TABLE_JAN17_ALL LIBRARY.TABLE_DEC16_ALL等SAS - 在表名中使用变量

例如代码:

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 - > LIBRARY.TABLEACC_ & vMonth。 我对此没有任何问题,但现在变量位于表名中间,出现错误。 错误:文件LIBRARY.TABLE_JAN17.DATA不存在。

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

%Let vMonth2 = JAN17; 

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

任何人都可以告诉问题是什么?

谢谢。

回答

0

有两个可能的问题。最简单的是你插入空白到你的宏变量。为了测试该理论,只需在周围显示值即可。

%put |&vmonth|; 

你的SQL代码应该使用TRIMMED关键字(如果您运行的是旧版本的SAS的使用分离的BY关键字,而不是)来强制SAS使得宏变量时卸下空白。

SELECT MonthName into :vMonth trimmed 

另一种可能性是,SAS编译器通过查看在对象名称的中间宏引用混淆和错误地将其视为两个或更多个标记,即使没有实际的嵌入的空格中的值。但是,这通常只发生在宏变量值已被宏观引用时。如果您看到该值没有实际的空白,则尝试使用%unquote()宏功能。

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

谢谢汤姆,修剪关键字工作。我正在使用trim(monthName),但之后没有意识到它有空白。 – mugenheimer