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:
。
我想通过在 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:
。