在SAS迭代Do循环中正确解析I
我在理解索引变量(I)如何在do循环中应用/解析时遇到问题。我有一个非常简单的SQL宏- *注意-宏是在前面的在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
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