在 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
我在理解索引变量 (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