如何在SAS中循环使用宏变量

如何在SAS中循环使用宏变量,sas,Sas,我有这样一个例子: proc sql; select dealno into :deal_no from deal_table; proc sql; create table counter as select dealno from deal_table; select dealno into :deal_no_1 - :deal_no_&sqlobs from deal_table; quit; %let N = &sqlobs; %macr

我有这样一个例子:

proc sql;
select dealno into :deal_no 
from deal_table; 
proc sql;
    create table counter as select dealno from deal_table;
    select dealno into :deal_no_1 - :deal_no_&sqlobs
    from deal_table;
quit;

%let N = &sqlobs;

%macro loop;
%do i = 1 %to &N;
    %put &&deal_no_&i;
%end;
%mend;

%loop; run;
现在我想遍历变量deal\u no,该变量现在包含表deal\u table中的所有dealno,但我不知道如何操作。

如果您这样做

%put &deal_no;
您可以看到,它只包含dealno的第一个值,而不是所有值。 为了避免这种情况,您可以执行以下操作:

proc sql;
select dealno into :deal_no 
from deal_table; 
proc sql;
    create table counter as select dealno from deal_table;
    select dealno into :deal_no_1 - :deal_no_&sqlobs
    from deal_table;
quit;

%let N = &sqlobs;

%macro loop;
%do i = 1 %to &N;
    %put &&deal_no_&i;
%end;
%mend;

%loop; run;

另一个选项是在sql代码中添加“分隔符”,这将在值中添加分隔符。然后,您可以在数据步骤中使用SCAN函数,或在宏中使用%SCAN来循环遍历这些值并执行您想要的任何任务。下面的例子

proc sql noprint;
select age into :age separated by ','
from sashelp.class;
quit;

%put &age.;

data test;
do i=1 by 1 while(scan("&age.",i) ne '');
    age=scan("&age.",i);
    output;
end;
drop i;
run;

这是另一个解决方案

proc sql noprint;
  select age into :ageVals separated by ' '
  from ageData;
quit;  

%put &ageVals;

%macro loopAgeVals;   %let i = 1;   %let ageVal = %scan(&ageVals, &i);

  %do %while("&ageVal" ~= "");
    %put &ageVal;

    %let i = %eval(&i + 1);
    %let ageVal = %scan(&ageVals, &i);   
  %end; 

%mend;

%loopAgeVals;

请告诉我们你想用这个做什么。虽然遍历宏变量列表肯定有一些合理的原因,但几乎所有时候都有一个更好的解决方案,使用现有的数据步编程方法。我想获取一个项目列表,然后检查每个项目是否满足指定的条件。例如:%macro loop--使用此处循环检索列表中的项目插入到表my_table select*中,该表中的交易id不在项目%mend中;如果这是您想要做的,那么在SQL中或在数据步骤中执行,而不使用宏变量循环。宏语言中的循环几乎总是错误的——这是一种缓慢、缓慢的方式。如果只做一次上述操作,那么Keith的解决方案会更好——在一个宏变量中获取所有值。如果您正在执行某种复杂的连接插入,那么毫无疑问,它可以在SQL中完成,也可以在没有宏的数据步骤中完成。谢谢您的建议。我刚开始学SAS,所以我对它了解不多。您引用了在SQL中或在数据步骤中执行此操作,而不使用宏变量循环,因此我也可以看看您的解决方案吗?我想知道有经验的SAS用户的解决方案。我正在使用我的答案中描述的方法,当我有几个不同的值要迭代10个左右,并且每个值都有大量的工作要做。我通常有一个宏,它对给定的月份进行分析,如果我必须对一系列月份进行分析,我必须从一些数据集中计算,我就使用这种方法。