使用Do循环的SAS外接接头

使用Do循环的SAS外接接头,sas,Sas,我需要找到一种方法来使用循环来联合我的数据集。 例如,我有三个不同列名的表。我想通过使用“外部nuion corr”将它们结合起来。 代码如下所示: proc sql; create table new as select * from a1 outer union corr select * from b1 outer union corr select * from c1

我需要找到一种方法来使用循环来联合我的数据集。 例如,我有三个不同列名的表。我想通过使用“外部nuion corr”将它们结合起来。 代码如下所示:

     proc sql;
         create table new as
         select * from a1
         outer union corr
         select * from b1
         outer union corr
         select * from c1   ;
    quit;
我想使用loop函数来实现这些并集

%macro union_a;
  proc sql;
   create table new as
    select * from a1
        %do i = 2 %to 3;
        outer union corr select * from a&i 
        ;
    quit;

 %end;
%mend;
%union_a;
这给了我一个错误:

NOTE: Line generated by the invoked macro "UNION_A".
5             outer union corr select * from a&i         ;
              -----
              180

ERROR 180-322: Statement is not valid or it is used out of proper order.
我该怎么做?谢谢大家!


JH

代码>%结束语句位于错误的位置

%macro union_a;
  %local i;
  proc sql;
    create table new as
      select * from a1
  %do i = 2 %to 3;
        outer union corr select * from a&i 
  %end;
    ;
  quit;
%mend;
缩进有助于使这一点更清楚。它还有助于缩进宏代码,而不依赖于它生成的SAS代码的缩进

还有,为什么不使用数据步骤呢

data new ;
  set a1-a3 ;
run;

%结束语句位于错误的位置

%macro union_a;
  %local i;
  proc sql;
    create table new as
      select * from a1
  %do i = 2 %to 3;
        outer union corr select * from a&i 
  %end;
    ;
  quit;
%mend;
缩进有助于使这一点更清楚。它还有助于缩进宏代码,而不依赖于它生成的SAS代码的缩进

还有,为什么不使用数据步骤呢

data new ;
  set a1-a3 ;
run;

通常是宏中生成分号的问题。为什么不是一个简单的数据步骤?您的数据集有命名约定吗?如果你这样做,集合或附加在这里会更有效。通常是宏中生成分号的问题。为什么不是一个简单的数据步骤?您的数据集有命名约定吗?如果这样做,这里的集合或附加将更有效。