SAS 9.3 在 proc sql select 中执行循环

SAS 9.3 do loop within proc sql select

我想通过在 proc sql 中使用 do 循环来加入如下数据集:我有宏变量 yymm0-yymm4; yymm0=1505; yymm11=1501.

这是没有 do-loop 的代码:

proc sql;
 create table output as
 select var1, var3 from data1 where a=1 union
 select var1, var3 from data2 where a=1 union
 select var1, var3 from data3 where a=1 union
 select var1, var3 from data4 where a=1
quit;
run;

如果我有 12 个数据集,数据集的名称是 data1-data12,我该怎么办?

我想自 SAS 9.3 起,您可以这样做:

data output;
set data: (keep = a var1 var3);
where a=1;
drop a;
run;

其中 data: 将匹配您的所有数据 1、数据 2...

当然,在 SQL 中,这相当于 union all,而不是 union

在 SAS 9.3 之前或当列表不是简单前缀时,构建一个宏变量来保存您的列表,例如:

%let mylist=;
proc sql noprint;
select catt(libname, '.', memname) into :mylist separated by ' '
from dictionary.tables where libname="your libname" and memname  like 'your_pattern%'
;
quit;

然后只需使用 &mylist 而不是 data: