使用SAS sql创建宏变量

时间:2013-02-07 18:44:29

标签: sql macros sas

我正在使用SAS sql创建一些宏变量供以后使用和打印报告。

我按组创建一些汇总变量(平均值,最小值,最大值等)。

以下代码适用于第一组,但不会为第二组和第三组创建宏变量。


data scores;
  input trt  t;
cards;  
1  10
1  11
1  12
1  13
2  4
2  5
2  6
2  7
3  9
3  8
3  7
3  6
;
run;



%macro cdi;


%do i = 1 %to 3;

proc sql noprint;
  select  n(t),  nmiss(t),  mean(t),  std(t),  min(t),  max(t) 
    into  :n&i,   :miss&i,  :mean&i,   :sd&i,  :min&i,  :max&i

  from scores
  where trt = &i;
quit;

%end;

%mend cdi;
%cdi;

*****  this call shows the right values  ;
%put &n1 &miss1 &mean1 &sd1 &min1 &max1 ;


*****  this call produces error (symbolic reference not resolved)  ;
%put &n2 &miss2 &mean2 &sd2 &min2 &max2 ;

我确定我错过了一些简单的东西,但我还没有看到它......

3 个答案:

答案 0 :(得分:4)

您的问题是您创建的宏变量是宏的本地变量。如果您希望在宏执行后存在,则需要在宏内部使用%global语句定义它们。

换句话说,将其添加到宏定义的顶部:

%global n1 miss1 mean1 sd1 min1 max1 
        n2 miss2 mean2 sd2 min2 max2 
        n3 miss3 mean3 sd3 min3 max3 ;

答案 1 :(得分:2)

为什么要创建汇总值的宏变量?实际上很少有人将它创建为一个表供以后使用并不是更好......而且它更快,更简单,更灵活。

proc sql;
create table summary as
select  trt, n(t) as n,  nmiss(t) as nmiss,  mean(t) as mean,  std(t) as std,  min(t) as min,  max(t) as max
from scores
group by trt;
quit;

或者,因为你在SAS ...

proc means data=scores;
var t;
class trt;
types trt;
output out=summary n= nmiss= mean= std= min= max= /autoname;
run;

然后在您希望的报告中使用它 - 或者将其合并回主数据集,如果这更容易的话。数据应该是数据,宏变量不应该是数据,而是程序输入。

答案 2 :(得分:-2)

鲍勃是对的。解决方案就像剪切和粘贴一样简单:

%macro cdi;


%do i = 1 %to 3;

proc sql noprint;
  select  n(t),  nmiss(t),  mean(t),  std(t),  min(t),  max(t) 
    into  :n&i,   :miss&i,  :mean&i,   :sd&i,  :min&i,  :max&i

  from scores
  where trt = &i;
quit;

%end;
*****  this call shows the right values  ;
%put &n1 &miss1 &mean1 &sd1 &min1 &max1 ;


*****  this call NO LONGER produces error (symbolic reference not resolved)  ;
%put &n2 &miss2 &mean2 &sd2 &min2 &max2 ;

%mend cdi;
%cdi;