SAS 9.3 делает цикл в proc sql select

я хотел бы присоединиться к набору данных, как показано ниже, используя цикл do внутри proc sql: у меня есть макропеременные yymm0-yymm4; ггмм0=1505; ггмм11=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?


person useR    schedule 06.07.2015    source источник
comment
SAS не может ссылаться более чем на пару десятков таблиц в одном операторе SQL.   -  person Tom    schedule 07.07.2015


Ответы (1)


Начиная с 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: .

person vasja    schedule 06.07.2015
comment
Большое спасибо @vasja, что, если имя набора данных является динамическими макропеременными? например rls&yymm0..data&yymm0. 0-11 ? - person useR; 06.07.2015
comment
Если вы всегда будете менять вопрос после ответа, старые ответы не будут иметь смысла. - person vasja; 06.07.2015
comment
хорошо. мне жаль насчет того. может быть, я должен задать другой вопрос - person useR; 06.07.2015