1

下面的 SQL 宏有什么问题?

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

我只在一个数据集上测试了没有宏元素的代码,并且效果很好,但是当我尝试使用下面的代码使其动态化时,它失败了。

我可以用一个简单的数据步来完成这项工作,但我对 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;
4

2 回答 2

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) 并仅输出循环外的最后一条语句。
于 2013-09-06T14:51:10.807 回答
1

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

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

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

于 2013-09-06T14:13:42.683 回答