在 SAS 迭代 Do 循环中正确解析 I

Resolving I correctly in a SAS Iterative Do Loop

我在理解索引变量 (i) 如何在 do 循环中 applied/resolved 时遇到问题。我有一个非常简单的 SQL 宏-

*注意 - 宏在前面的 proc sql noprint; 以及宏外的 quit; 语句之后调用。

%macro psql(into,date);
   select count(distinct task) into: &into
   from source
   where c_date between &start and &date;
%mend psql;

通过 - %psql(count10,&date10);

调用宏

*注意 - 宏变量 &date10-&date20 之前都已定义。这完美地工作 - 创建宏 var &count10,使用来自 &date10-&date20 的日期值为每一行调用 %psql 宏及其各自的参数。

一如既往,我被要求将此扩展到更多日期,因此列出 %psql 宏将是重复的。

假设 do 循环最有效,我尝试了以下操作以使用索引 (i) 来创建我的变量,而不是许多宏调用(每个都包含新的宏参数):

%macro doloop;
   %do i=10 %to 20;
      proc sql noprint;
         select count(distinct task) into: count&i
         from source
         where c_date between &start and &date&i;
      quit;
   %end;
%mend doloop;

我尝试使用 (I) 来创建 &count 宏变量并引用 &date 参数似乎无法解决,因为实际的宏变量是 created/referenced,但变量 (I) 本身似乎在迭代期间正确解析 -

SYMBOLGEN:  Macro variable I resolves to 10
SYMBOLGEN:  Macro variable START resolves to    20429
SYMBOLGEN:  Macro variable DATE resolves to    20435
SYMBOLGEN:  Macro variable I resolves to 10

SYMBOLGEN:  Macro variable I resolves to 11
SYMBOLGEN:  Macro variable START resolves to    20429
SYMBOLGEN:  Macro variable DATE resolves to    20435
SYMBOLGEN:  Macro variable I resolves to 11

问题是否涉及我尝试使用 (I) 以 "call" 现有的宏变量,并同时使用 (I) 创建宏变量?我如何引用 (I) 以创建我的 &count 变量 (&count10-&count....) 同时使用已经存在的日期变量 (&date10-&date....) ?

我想你是在谈论 count&i&date&i&&date&i 之间的区别。

count&i 将解析为 COUNT10。并且您的 SQL 代码编写方式将用作接收计数的宏变量的名称。

&date&i 将取决于 DATE 宏变量的值。如果宏变量 DATE 的值为 20435 那么您的 SQL 代码将在您的日期比较中使用值 2043510,即 7554 年[=24] =]

&&date&i会先缩减为&date10,然后进一步解析为宏变量的值DATE10。我认为这就是您想在 SQL 代码中使用的内容。

这是一个启用了 SYMBOLGEN 的示例。

105  %let date10=SOME DATE VALUE;
106  %let date=ANOTHER DATE VALUE;
107  %let i=10;
108  options symbolgen;
109  %put count&i;
SYMBOLGEN:  Macro variable I resolves to 10
count10
110  %put &date&i;
SYMBOLGEN:  Macro variable DATE resolves to ANOTHER DATE VALUE
SYMBOLGEN:  Macro variable I resolves to 10
ANOTHER DATE VALUE10
111  %put &&date&i;
SYMBOLGEN:  && resolves to &.
SYMBOLGEN:  Macro variable I resolves to 10
SYMBOLGEN:  Macro variable DATE10 resolves to SOME DATE VALUE
SOME DATE VALUE