首页 > 解决方案 > 我在 SAS 宏中使用 IF 语句时遇到困难

问题描述

我在 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 领域。

标签: sassas-macro

解决方案


先说一点术语。您的代码定义了一个,%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));

然后,如果您需要,您可以获得该新日期的 YEAR 和 MONTH。

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

推荐阅读