【问题标题】:Resolving I correctly in a SAS Iterative Do Loop在 SAS 迭代执行循环中正确解析 I
【发布时间】:2015-12-20 14:55:35
【问题描述】:

我在理解如何在 do 循环中应用/解析 Index 变量 (i) 时遇到问题。我有一个非常简单的 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 循环是最有效的,我尝试了以下操作以使用 index(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 参数似乎无法解决正在创建/引用的实际宏变量,但变量 (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) 调用日期变量而不是使用预定义的日期宏变量是否有意义?

标签: sas sas-macro do-loops


【解决方案1】:

我认为您在谈论count&i&date&i&&date&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

【讨论】:

  • 我相信您是正确的,但我无法确认这一点,因为我不明白多个“&”的解决方式,尽管我已经多次看到帖子(我相信是乔)。最后一条语句正是我想要的……第一次迭代使用 &DATE10 的日期宏 var 生成宏 var COUNT10。
  • 您可以使用 SYMBOLGEN 来观看它的运行情况。 %let date10=SOME DATE VALUE;%let i=10;options symbolgen;%put &&date&i;
  • 不确定我是否可以这样做,但我可以重新参考这篇文章吗?昨天进行更新时,此解决方案运行良好。现在,宏变量 Count10-count... 将无法正确解析...
  • 如果您使用的是宏,请确保先定义宏变量或在宏中添加%GLOBAL 语句。否则,PROC SQL 生成的 COUNTxxx 宏变量将是宏的本地变量,并在宏结束时消失。很可能昨天您已经定义了它们,因此宏使用现有的宏变量而不是创建新的本地变量。
  • 啊哈!呃!你是对的!此外,我尝试使用 %global Kured:; 来缩短全局变量列表。 - 但它似乎不喜欢“:”,因为它通常是我的快捷方式。希望这可以使我免于列出所有创建的变量……似乎没有。将这些宏变量列为全局变量的任何快捷方式,或者我是否坚持输入 15~ 宏变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多