SAS SQL宏将多个数据集合并为一个

时间:2013-09-06 13:52:27

标签: sql macros sas

以下SQL宏的问题是什么?

我有多个名为“C_out1”2,3,4的数据集,依此类推,我想从每个数据集中只提取一个数字到一个新表中。我搜索并寻找帮助,但没有任何运气。

我已经在一个数据集上测试了没有宏元素的代码并且工作正常,但是当我尝试使用下面的代码使其动态化时,它会失败。

我能够使用简单的datastep完成这项工作,但我对SQL语言还不熟悉,我真的希望能够做到这一点。我必须加入近200,000个数据集,所以我猜测SQL比数据步骤更可取。

我收到错误:

"NOTE: Line generated by the macro variable "I".
1             C_out5
              ------
              78
ERROR 78-322: Expecting a ','.

974          where label2='c';
975  quit;

代码:

 %macro loop(prefix2);
    %do i=1 %to 5;
        &prefix2&i
        %let i = %eval(&i+1);
    %end;
    %mend loop;

    PROC SQL;   
    create table CTOTAL as
        select nvalue2
        from %loop(C_out)
        where label2='c';
    quit;

2 个答案:

答案 0 :(得分:1)

数据步骤是一种比SQL更好的方法。

data CTOTAL;
set C_out:;
where label2='c';
run;

如果您没有使用所有c_out数据集,则可能需要做一些工作来改进这一点,但如果您使用所有c_out数据集,那么这将按原样运行。

答案 1 :(得分:1)

乔的回答是最好的。

如果必须使用SQL:

您的SQL不正确。您需要使用UNION ALL执行此操作。此解决方案适用于SQL:

%macro loop(prefix2);
    %do i=1 %to 4;
        select nvalue from &prefix2&i where str='c' union all
    %end;
    select nvalue from &prefix2&i where str='c'
%mend loop;

PROC SQL;   
create table CTOTAL as
    %loop(C_out)
    ;
quit;
  1. 无需手动递增&i值。
  2. 循环会在最后一个循环中将&i放到(n + 1),所以让循环转到(n-1)并输出循环外的最后一个语句。