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

在SAS迭代Do循环中正确解析I,sas,sas-macro,do-loops,Sas,Sas Macro,Do Loops,我在理解索引变量(I)如何在do循环中应用/解析时遇到问题。我有一个非常简单的SQL宏- *注意-宏是在前面的procsqlnoprint之后调用的以及退出语句 %macro psql(into,date); select count(distinct task) into: &into from source where c_date between &start and &date; %mend psql; 通过-%psql(count10,&da

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

*注意-宏是在前面的
procsqlnoprint之后调用的
以及
退出语句

%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
,为调用
%psql
宏及其相应参数的每一行使用
&date10-&date20
中的日期值

和往常一样,我被要求将其扩展到更多的日期,因此列出
%psql
宏将是重复的

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

我尝试使用(I)来创建
&count
宏变量并引用
&date
参数似乎无法与正在创建/引用的实际宏变量进行解析,但变量(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)来“调用”现有的宏变量,以及同时使用(I)来创建宏变量?在使用已有的日期变量(&date10-&date…)时,我如何引用(I)来创建我的&count变量(&count10-&count…)呢?

我想你是在谈论
计数&I
日期&I
日期&I
之间的区别

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

&date&i
将取决于
date
宏变量的值。如果宏变量
DATE
具有值
20435
,则SQL代码将在日期比较中使用值
2043510
,即7554年

和&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)而不是预定义的日期宏变量调用日期变量有意义吗?我相信你是正确的,但我无法确认这一点,因为我不理解多重“&”解析的方式,尽管我已经看过这篇文章很多次了(我相信是Joe写的)。最后一条语句正是我想要的……第一次迭代使用&DATE10的date宏var生成宏var COUNT10。您可以使用SYMBOLGEN来观察它的运行<代码>%let date10=某个日期值;%设i=10;选项symbolgen;%放置日期(&i)不确定我是否可以这样做,但我可以重新引用此帖子吗?在昨天进行更新时,此解决方案运行良好。现在,宏变量计数10计数。。。无法正确解析…如果使用宏,请确保首先定义宏变量,或在宏中添加
%GLOBAL
语句。否则,PROC SQL生成的COUNTxxx宏变量将是宏的本地变量,并在宏结束时消失。很可能昨天您已经定义了它们,所以宏使用了现有的宏变量,而不是创建新的本地变量。啊!哼!你说得对!此外,我还尝试使用%global cured:;-但它似乎不喜欢“:”因为它通常是我的捷径。希望这能让我免于列出所有创建的变量…似乎不是。任何将这些宏变量列为全局变量的快捷方式,或者我必须输入15个宏变量。
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