繁体   English   中英

SAS:总结proc sql

[英]SAS: Summing in proc sql

我正在做一个SAS项目,要求我对行进行总结。 这是我的代码:

proc sql;
  create table total as
    select 
      sum(ans1) as sum1,
      sum(ans2) as sum2,
      sum(ans3) as sum3,
      sum(ans4) as sum4
    from proj.scores;
quit;

我的问题是有150个变量(标记为ans1-ans150)。 有没有一种方法可以对每个变量进行求和,而不必继续我一直达到的150?

我认为适当的工具将使整个过程更加容易。 SQL没有用于处理大量变量的功能。

proc summary;
   output out=sum sum(ans1-ans150)=sum1-sum150;
   run;

是的,您可以使用宏逻辑并用循环替换您的1、2、3 ...行来执行此操作。 此方法使用“ backstop”变量,以便循环中的逗号不会在循环的第150次迭代中引起错误(删除此变量)。

%macro summer;

    proc sql;
        create table total (drop = backstop) as select
            %do i = 1 %to 150;
                sum(ans&i.) as sum&i.,
            %end;
            "" as backstop
            from proj.scores;
    quit;

%mend summer;

%summer;

更好的方法(我认为)是通过以下方式使用宏:

data have;
input x1-x10;
datalines;
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
;;;;
run;

%macro sum_loop(prefix=, outfix=, start=1, end=);
%local i;
%do i = &start. %to &end.;  /* loop over start to end */
  sum(&prefix.&i.) as &outfix.&i.   /* the actual SQL statement */
  %if &i < &end %then %do; , %end;  /* that way you get commas after all non-last entries */
%end;
%mend sum_loop;

proc sql;
  create table total as
    select 
      %sum_loop(prefix=x,outfix=sum,start=1,end=10)
    from have
  ;
quit;

这样,宏只负责您需要循环的内容。 这使得它更可重用且更易于维护-WHERE和FROM等是分开的。更好的办法是将内部拆分为自己的宏,并具有通用的looper宏,但在这里可能会过大...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM