Macros SAS循环通过宏变量列表

Macros SAS循环通过宏变量列表,macros,sas,Macros,Sas,首先,我是新来的,所以如果这不是一个好问题,我道歉。我搜索了一下,但没有找到类似的东西。我不确定我的方法是否正确,因此我们将不胜感激 我正在为一所有学期的学校制作一个数据集,例如2017SP是2017年春季,2017SU是2017年夏季等等 我有下面的程序,我在上面设置了一个宏变量,然后用它从各种库和数据集中提取术语。请注意,我有几个数据步骤,只需要在5次以上运行整个程序 %STC_TERM=2017SU 数据步; 集合(包含所有术语数据的库); 如果STC_TERM=“&STC_TERM”;

首先,我是新来的,所以如果这不是一个好问题,我道歉。我搜索了一下,但没有找到类似的东西。我不确定我的方法是否正确,因此我们将不胜感激

我正在为一所有学期的学校制作一个数据集,例如2017SP是2017年春季,2017SU是2017年夏季等等

我有下面的程序,我在上面设置了一个宏变量,然后用它从各种库和数据集中提取术语。请注意,我有几个数据步骤,只需要在5次以上运行整个程序

%STC_TERM=2017SU

数据步;
集合(包含所有术语数据的库);
如果STC_TERM=“&STC_TERM”;
*我想做的其他事情*
跑
我的程序中还有其他几个类似的数据步骤,它们最终为我提供了所需的输出数据

现在我需要创建一个数据集,其中包含五个学期的数据,这些数据只是附加在一起

而不是运行我的代码5次,只是将“%let STC_TERM=2017SU;”更改为 “%let STC_TERM=2016SU;”对于我想要的每一年,我希望有某种方式提供我的5个术语列表,让SAS循环5个术语中的每一个,并将结果附加在一起

这五个术语是(2017SU、2016SU、2015SU、2014SU、2013SU)

有没有办法把这个列表交给我的程序,让它先在2017年SU上执行所有的数据步骤,然后在下个学期,依此类推,并将结果的5组数据加在一起


我不能把所有感兴趣的术语都放在数据步骤中,因为有些术语之间有重复的数据,需要单独处理。尝试将所有术语放入数据步骤之前对我不起作用,因此我希望通过在每个学期分别运行整个程序来保持它们的独立性。

只需将现有代码包装在宏中,并让宏在值列表上迭代即可。另一个例子见另一个问题:

如果希望将结果累积到单个表中,则在代码末尾添加一个PROC APPEND步骤

%macro do_all(termlist);
  %local i stc_term ;
  %do i=1 %to %sysfunc(countw(&termlist,%str( )));
    %let STC_TERM=%scan(&termlist,&i,%str( ));

data step1;
  set have ;
  where STC_TERM = "&STC_TERM";
  * ... other things I want to do in this step ... ;
run;
...
data step_last;
   set stepX;
   ...
run;

proc append base=all data=step_last force ;
run;

  %end;
%mend do_all;
然后用值列表调用它

%do_all(2017SU 2016SU 2015SU 2014SU 2013SU)

可能的副本的副本。这个问题问的是procsql,但是数据步骤可以很容易地替换。对不起,我不明白这是怎么一个问题。他只有一个程序。我有几个数据步骤(总共12个),其中一些使用宏变量。我不想对每个数据步骤都进行更改。应该有一种方法可以让整个程序运行一个不同的学期,这个学期是由顶部的宏变量指定的。@elfrozo因为答案是一样的,所以是一样的:将它包装在一个宏中,然后循环整个过程。您不必更改任何数据步骤。@Joe,谢谢。你说得对,这样也行,而且会更简单。我现在正在读这篇文章:非常感谢。这是有道理的,我现在知道怎么做了。你的代码对我来说非常有效。