以下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;
答案 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;
&i
值。 &i
放到(n + 1),所以让循环转到(n-1)并输出循环外的最后一个语句。