【问题标题】:SAS - Using variable in table nameSAS - 在表名中使用变量
【发布时间】:2017-02-23 14:58:27
【问题描述】:

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

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

%Let vMonth2 = JAN17;

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

任何人都可以就问题所在提出建议吗?

谢谢。

【问题讨论】:

    标签: sas proc-sql


    【解决方案1】:

    有两个可能的问题。最简单的一种是在宏变量中插入空白。要测试该理论,只需在其周围显示值即可。

    %put |&vmonth|;
    

    您的 SQL 代码应使用 TRIMMED 关键字(如果您正在运行旧版本的 SAS,请改用 SEPARATED BY 关键字)以强制 SAS 在创建宏变量时删除空格。

    SELECT MonthName into :vMonth trimmed
    

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

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

    【讨论】:

    • 谢谢汤姆,修剪后的关键字有效。我正在使用 trim(monthName) 但之后没有意识到它有空格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    相关资源
    最近更新 更多