同一步骤中使用与创建SAS宏:宏变量未解析问题修复
SAS宏变量未正确赋值的修复方案
你的问题根源是宏变量作用域:默认情况下,宏内部通过into语句创建的宏变量属于「宏本地作用域」,宏执行完毕后这个变量会被自动销毁,所以外部调用&salescount会提示未解析。
下面提供两种无需重复编写PROC SQL的修复方式:
方法一:声明全局宏变量
在宏内部用%global语句将目标宏变量声明为全局作用域,这样宏执行完后变量会保留在SAS会话中:
%macro counts (variable1, count, dataname); %global &count; /* 把传入的count参数指定的变量设为全局 */ proc sql noprint; /* 加noprint避免输出冗余结果,提升效率 */ select count(distinct &variable1) into :&count trimmed from &dataname; quit; %mend counts; /* 调用宏 */ %counts(userid, salescount, customers) /* 验证变量是否可用 */ %put 去重用户数:&salescount;
方法二:直接赋值全局宏变量(SAS 9.4+支持)
无需额外声明,直接在into语句中指定全局作用域(用:GLOBAL.前缀):
%macro counts (variable1, count, dataname); proc sql noprint; select count(distinct &variable1) into :GLOBAL.&count trimmed from &dataname; quit; %mend counts; /* 调用宏 */ %counts(userid, salescount, customers) /* 验证变量是否可用 */ %put 去重用户数:&salescount;
注意事项
- 两种方法都会覆盖已存在的同名全局宏变量,使用前确认变量用途
noprint是可选优化,去掉也不影响功能,但能避免PROC SQL输出查询结果集
内容的提问来源于stack exchange,提问作者Jont
相关产品推荐
相关产品推荐

