请选择 进入手机版 | 继续访问电脑版
楼主: fusong0811
3388 8

[实际应用] sas宏 循环编写 [推广有奖]

  • 0关注
  • 0粉丝

初中生

42%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.8034
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
172 点
帖子
6
精华
0
在线时间
21 小时
注册时间
2020-4-2
最后登录
2021-1-15

fusong0811 发表于 2020-4-2 10:59:01 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
本人刚接触SAS不久,有一个关于SAS宏 循环编写的问题求助各位大佬。

我编写了一个宏  
%MRYH(rq=24mar2020, bh=1044)
这个宏我需要按天修改rq这个宏参数:24mar2020、23mar2020、22mar2020........
因为天数太多,想编写一个循环来实现自动替换日期,我看了些参考,摸索了一下写了一个:

%macro A;
%do i = 1 %to 2 %by 1;
%RQQ=intnx("day","24mar2020"d,i);
%MRYH(rq=&RQQ., bh=1044);
%end;
%mend A;

%A

但是一直提示我没有解析宏"RQQ",请问正确的写法是什么,谢谢!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:SAS宏 Macro Mar End Mac

回帖推荐

extension 发表于3楼  查看完整内容

1. 宏变量RQQ的定义要用%let语句; 2. intnx是SAS函数,在宏程序中执行需要加宏函数%sysfunc或%qsysfunc; 3. intnx中的递增值i是宏变量,要改成&i; 4. 宏函数%sysfunc或%qsysfunc中对于字符不用加引号。 所有需要把%RQQ=intnx("day","24mar2020"d,i);这一句改成 %let RQQ=%sysfunc(intnx(day,"24mar2020"d,&i));
已有 1 人评分经验 收起 理由
eijuhz + 40 精彩帖子

总评分: 经验 + 40   查看全部评分

whymath 发表于 2020-4-3 21:42:41 |显示全部楼层 |坛友微信交流群
请解释宏变量 RQQ 的含义,是今天的日期吗?

使用道具

extension 发表于 2020-4-3 23:06:26 |显示全部楼层 |坛友微信交流群
1. 宏变量RQQ的定义要用%let语句;
2. intnx是SAS函数,在宏程序中执行需要加宏函数%sysfunc或%qsysfunc;
3. intnx中的递增值i是宏变量,要改成&i;
4. 宏函数%sysfunc或%qsysfunc中对于字符不用加引号。
所有需要把%RQQ=intnx("day","24mar2020"d,i);这一句改成
%let RQQ=%sysfunc(intnx(day,"24mar2020"d,&i));

使用道具

fusong0811 发表于 2020-4-4 11:21:40 |显示全部楼层 |坛友微信交流群
whymath 发表于 2020-4-3 21:42
请解释宏变量 RQQ 的含义,是今天的日期吗?
RQQ是我需要替换得日期  %MRYH(rq=24mar2020, bh=1044) 这个宏里面 &rq这个值我需要按天来替换,比如往后推30天得每天日期,循环放入%MRYH这个宏中作为rq得值

使用道具

fusong0811 发表于 2020-4-4 11:24:03 |显示全部楼层 |坛友微信交流群
extension 发表于 2020-4-3 23:06
1. 宏变量RQQ的定义要用%let语句;
2. intnx是SAS函数,在宏程序中执行需要加宏函数%sysfunc或%qsysfunc; ...
感谢您得回答,学习了!谢谢

使用道具

fusong0811 发表于 2020-4-4 11:32:44 |显示全部楼层 |坛友微信交流群
fusong0811 发表于 2020-4-4 11:21
RQQ是我需要替换得日期  %MRYH(rq=24mar2020, bh=1044) 这个宏里面 &rq这个值我需要按天来替换,比如往后 ...
您好  还要请教一下  我按照您说得进行了调整如下:
%macro A;
%do i=0 %to 29 %by 1;
%let RQQ=%sysfunc(intnx(day,"01apr2020"d,&i));
%MRYH(rq=&RQQ, bh=1044) ;
%end;
%mend A;

运行以后报错显示为:无效的日期/时间/日期常熟"22006"d,请问这个是什么原因呢?

使用道具

extension 发表于 2020-4-4 21:42:02 |显示全部楼层 |坛友微信交流群
fusong0811 发表于 2020-4-4 11:32
您好  还要请教一下  我按照您说得进行了调整如下:
%macro A;
%do i=0 %to 29 %by 1;
出错的原因在于RQQ是一个字符串格式的日期,你只需要将其转换成数值就可以了,无须再用"&RQQ"d来转换

使用道具

fusong0811 发表于 2020-4-7 10:52:13 |显示全部楼层 |坛友微信交流群
extension 发表于 2020-4-4 21:42
出错的原因在于RQQ是一个字符串格式的日期,你只需要将其转换成数值就可以了,无须再用"&RQQ"d来转换
不好意思 老师  确实才接触SAS不久  尝试了您说的方式  还是报错  可能表达式还是有问题  还得再请教一下

%MRYH(rq=&RQQ, bh=1044)    我 %MRYH 这个宏里面  rq  这个变量是这么用的   数仓里面有一个字段  stat_dt  我用的proc sql 需要的条件是 :
where stat_dt = &rq. , 我尝试使用您说的方式   stat_dt <= input(&rq.,9.)  报错提示:用等于的表达式具有不同数据类型的组件,想在请教一下这是什么原因,是我的表达式有问题吗,谢谢

使用道具

extension 发表于 2020-4-7 22:10:20 |显示全部楼层 |坛友微信交流群
fusong0811 发表于 2020-4-7 10:52
不好意思 老师  确实才接触SAS不久  尝试了您说的方式  还是报错  可能表达式还是有问题  还得再请教一下 ...
首选,你要确定数仓中字段stat_dt是数值型还是字符型的变量,如果是字符型,你的where语句要加引号where stat_dt = "&rq.";如果是数值型,你可以直接用where stat_dt = & rq.; 或者在input函数中加引号where stat_dt <= input("&rq.",9.);

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-28 17:28