【发布时间】: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 ;
任何人都可以就问题所在提出建议吗?
谢谢。
【问题讨论】: