SAS-proc-SQL迭代

SAS-proc-SQL迭代,sas,Sas,下面是初始宏代码 %let bdate='01JAN2001'd ; %let bno=11; %let date='01JAN2001'd ; %let sno=%eval(&bno + %sysfunc(intck(month,&bdate,&date))); %let no=%eval(&sno.+2) %put &=date &=sno &=no; DATE='01JAN2001'd SNO=11 no=13 我想做两件事。将从s

下面是初始宏代码

%let bdate='01JAN2001'd ;
%let bno=11;
%let date='01JAN2001'd ;
%let sno=%eval(&bno + %sysfunc(intck(month,&bdate,&date)));
%let no=%eval(&sno.+2)
%put &=date &=sno &=no;
DATE='01JAN2001'd SNO=11 no=13
我想做两件事。将从sno到no的值放入新的数据集中,如 下面

第二,我想根据上面解析的宏sno到no在proc SQL下面进行迭代,我的意思是,根据上面的值,它必须是11、12和13之间的循环,而不使用宏

proc sql;
create table new &no as select from sample where deal in (&no);
quit;
下面是使用上述解析宏后的迭代过程SQL逻辑

proc SQL;
create table new11 as select from sample where deal in (11);
quit;

proc SQL;
create table new12 as select from sample where deal in (12);
quit;

proc SQL;
create table new13 as select from sample where deal in (13);
quit;
我不想把上面的procsql放到宏和进程中。它必须从现在开始继续

%put &=date &=sno &=no;

在没有宏的情况下这样循环的方法是使用
callexecute
。但是,在大多数情况下,使用宏将生成更易于编写和理解的代码。如果出于某种原因必须远离宏,则可以实现以下描述:

%let bdate='01JAN2001'd ;
%let bno=11;
%let date='01JAN2001'd ;
%let sno=%eval(&bno + %sysfunc(intck(month,&bdate,&date)));
%let no=%eval(&sno + 2);
%put &date &sno &no;

data sno_to_no;
    do no = &sno to &no;
        output;
    end;
run;

data sample;
    set sno_to_no;
    deal = no;
run;

data _null_;
    set sno_to_no;
    call execute('proc sql; create table new'||strip(no)||' as select * from sample where deal in ('||strip(no)||'); quit;');
run;

根据您的需要,只需将调用execute置于
sno_to_no
数据步骤中的
output
语句之前,就可以简化。显然,您不需要我在这里提供的
示例
数据步骤-我将其包括在内,以便代码可以为我的示例运行。

您想要没有宏的类似宏的功能吗?你看过DOSUBL或callexecute吗?可能调用EXECUTE。像这样分割数据通常不是一个好主意……您现在可能要走的是一条包含所有宏的道路,而不是通过宏或组处理。
%let bdate='01JAN2001'd ;
%let bno=11;
%let date='01JAN2001'd ;
%let sno=%eval(&bno + %sysfunc(intck(month,&bdate,&date)));
%let no=%eval(&sno + 2);
%put &date &sno &no;

data sno_to_no;
    do no = &sno to &no;
        output;
    end;
run;

data sample;
    set sno_to_no;
    deal = no;
run;

data _null_;
    set sno_to_no;
    call execute('proc sql; create table new'||strip(no)||' as select * from sample where deal in ('||strip(no)||'); quit;');
run;