sas - 我在 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 领域。
解决方案
先说一点术语。您的代码定义了一个宏,%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));
推荐阅读
- push-notification - 如何注册展会推送通知设备
- django-views - /view_appointment/make_appointment/ 处的 UnboundLocalError
- javascript - 如何使用javascript使多个div一个接一个地出现?
- python - 训练期间的 Huggingface 错误:AttributeError: 'str' object has no attribute 'size'
- flutter - Flutter:更改 URL 策略会导致应用重新加载
- javascript - 反应:更改上下文(useContext)的状态后无法使用路由器导航视图
- javascript - AsyncIterator 突然退出“for await-of”循环
- python - pd.json_normalize() 给出“str object has no attribute 'values'”
- python - 在python中显示图像的连续变化
- mysql - Ubuntu启动mysql/mysql服务器