楼主: crackman
1395 0

[原创博文] 跟crackman读sas程序(134)–通过SQL语句调用宏程序 [推广有奖]

院士

83%

还不是VIP/贵宾

-

威望
6
论坛币
91908 个
通用积分
23.3245
学术水平
424 点
热心指数
505 点
信用等级
256 点
经验
113002 点
帖子
2948
精华
0
在线时间
2529 小时
注册时间
2007-4-26
最后登录
2024-4-23

初级热心勋章 中级热心勋章 初级学术勋章 初级信用勋章

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
http://crackman.net/?p=1333

第一种方法:通过DO循环语句调用宏程序
%macro printclass(gender);
data subset&gender;
if _n_=1 then call symput(“TimeNow”,put(time(),timeampm13.2));
set sashelp.class(where=(sex=”&gender”));
run;
proc print data=&syslast;/*&SYSLAST是系统自动宏变量,表示最近生成的数据集的名称*/
title1 “Report from %trim(&SYSLAST) at &TimeNow”;
run;


%mend printclass;
%macro callmacro;
proc sort data=sashelp.class(keep=sex) out=levels nodupkey;
by sex;
run;
%local i levels;
data _null_;
set levels end=no_more;
call symput(“parm”||left(_n_),sex);/*将SEX这一个变量的所有值复制给以PARM为开头的系列变量*/
if no_more then call symput(“levels”,_N_);/*用宏变量&LEVELS记录数据集LEVELS的观测数*/
run;
%do i=1 %to &levels;
%printclass(&&parm&i);/*通过DO循环调用宏程序*/
%end;
%mend callmacro;
options nomprint nomlogic;
%callmacro;

第二种方法:
SQL语句调用宏程序
%macro printclass(gender);
data subset&gender;
if _n_=1 then call symput(“TimeNow”,put(time(),timeampm13.2));
set sashelp.class(where=(sex=”&gender”));
run;
proc print data=&syslast;
title1 “Report from %trim(&SYSLAST) at &TimeNow”;
run;
%mend printclass;
proc sql noprint;
select distinct ‘%printclass(‘||sex||”)”
into :mcalls separated by ” ” /*记录这里宏变量MCALLS记录不是一个变量而是表达式%printclass(M)   %printclass(F),记住这里的宏程序调用时,不需要在后面加分号*/
from sashelp.class;
quit;
options nomprint nomlogic;
&mcalls/*这里可以不加分号,如果有是为了程序的可读性*/

大家可以研究一下 还有那种方式可以生成宏程序表达式?
二维码

扫码加我 拉你入群

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

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

关键词:crackman Ackman sql语句 sas程序 CRACK levels where 程序

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
hopewell + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

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

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

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

GMT+8, 2024-5-11 21:58