【问题标题】:SAS loop containing many proc sql statements包含许多 proc sql 语句的 SAS 循环
【发布时间】:2026-02-01 15:00:01
【问题描述】:

我在 SAS EG 工作,有一个程序可以从多个数据库中提取数据,进行一些分析,然后输出一个包含一些新数据的汇总表。我现在被告知我需要这样做几十次,并且非常努力地在 SAS 中使用内部 proc SQL 语句创建一个循环。

让我再次尝试更详细地总结一下。

当前代码:

获取员工人数、车队、职位并输出一个汇总表,将他们当月所做的各种事情与同类别中的其他人进行比较(主要使用 proc SQL)。

我需要做的:

给定另一个包含几十个相同变量(员工编号、车队、职位)列表的表格,我需要为每个独特的员工信息生成相同的摘要信息。

非常感谢任何帮助!对 SAS 来说仍然很新(不像 SQL 那么多),所以描述性越强越好。

【问题讨论】:

  • 您是否在问如何使用 GROUP BY 或普通 SAS BY 处理在一次运行中执行所有子分析?或者您正在寻找代码生成技术?像 SAS 宏代码。
  • @tom 我希望能够一次性完成,但不知道如何......如果在两个程序中更容易做到这一点,我可以做到,但从未在 SAS/ SQL 所以不太确定如何
  • 如果你有一个工作程序,这里的教程可以帮助你:github.com/statgeek/SAS-Tutorials/blob/master/…

标签: sql loops sas proc-sql


【解决方案1】:

一般而言,在 SAS 中,您会定义一个宏,以便能够使用不同的变量(或任何其他需要更改的代码部分)重新运行多步流程。无论您要生成的代码是否包括 PROC SQL 步骤或 DATA 步骤或任何其他过程,都是如此。

替换因引用宏变量而异的代码部分。使用这些宏变量作为参数将代码包装在宏定义中。然后为每组参数值调用宏。

例如,如果您只是希望输入是单个变量名,您的宏定义可能如下所示:

%macro mymacro(var);
   ... use &VAR. in your analysis code to replace the hard coded variable name ...
%mend ;

然后你可以多次调用它。

%mymacro(var1);
%mymacro(var2);

【讨论】:

  • 所以我现在已经设置好了,我可以在 %mend 下面调用该函数,但仍在努力简单地遍历数据集的所有行并选择我需要设置它们的值作为宏变量...这里有什么建议吗?
  • 在数据步骤中使用 CALL EXECUTE() 根据数据集中变量的值生成宏调用。 data _null_; set unique_values; call execute(cats('%nrstr(%mymacro)(',varname,')'));run; 或者如果列表很小,请使用 SQL 中的 INTO : 语法在宏变量中生成调用。 select distinct cats('%mymacro(',varname,')') into :mcalls separated by ' ' from values; &mcalls;
  • 我现在要提出一个新问题,因为我希望能够更轻松地输入代码,而评论部分对此并不满意。很快就会链接!