【问题标题】:I am having difficulty using an IF statement within a SAS Macro我在 SAS 宏中使用 IF 语句时遇到困难
【发布时间】:2019-10-29 18:26:05
【问题描述】:

我在 SAS 中设置批处理脚本,我希望它每月运行并输出到表格,手动运行时代码可以工作,但我在设置宏时遇到困难。

我创建了 3 个宏,一个用于上个月(请忽略硬编码的 12 和注释掉的代码,我只是在测试它是否有效,注释掉的代码将保留,而硬编码的 12 将是当我可以让它工作时删除),一个用于今年,一个用于上一年。我遇到的问题是脚本会获取月末数据,所以到 1 月时,年份将设置为 2020 年,但该月将寻找 12 月的数据。

`%let pmonth = 12 /*%sysfunc(month(%sysfunc(intnx(month,"&sysdate"d ,-1))))*/;`

`%put &pmonth;` 

`%let year1 = %sysfunc(year("&sysdate"d));`

`%put &year1;` 

`%let year2 = %sysfunc(year(%sysfunc(intnx(year,"&sysdate"d ,-1))));`

`%put &year2;` 

`%macro year;
%if &pmonth = 12 %then %do;
&year2;
%end;
%else %do;
&year1;
%end;
%mend;
%year;`

我想要的是在我的代码中使用的宏年,根据月份宏 pmonth 在 year1 和 year2 之间正确选择。我玩过一些宏,但老实说,它不是我经常使用的 SAS 领域。

【问题讨论】:

  • 您是否要计算上个月?还是下个月?

标签: sas sas-macro


【解决方案1】:

首先是一些术语。您的代码定义了一个,%YEAR。它确实有三个宏变量,分别命名为 YEAR1、YEAR2 和 PMONTH。并且没有您的代码试图创建或使用的名为 YEAR 的宏变量。而且您的代码没有任何 IF 语句。但是在 YEAR 宏的定义中有一个 %IF 语句。

您可能希望将宏变量值转换为实际的 DATE 值来处理年份问题。因此,如果您的输入是带有 YEAR 和 MONTH 的两个宏变量,您可以将其转换为日期。

%let year1=2018;
%let month=1;
%let date=%sysfunc(mdy(&month,1,&year1));

然后,如果您想查找上个月的月底,您可以在 INTNX() 函数调用中使用日期。

%let end_of_prev_month=%sysfunc(intnx(month,&date,-1,e));

然后,如果需要,您可以获取该新日期的年份和月份。

%let year2=%sysfunc(year(&end_of_prev_month));
%let month2=%sysfunc(month(&end_of_prev_month));

【讨论】:

  • 感谢汤姆,无论是术语课程还是回答我的问题并给我一个可行的解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 2017-05-20
  • 1970-01-01
相关资源
最近更新 更多