【问题标题】:SAS: Summing in proc sqlSAS:在proc sql中求和
【发布时间】:2016-06-10 17:34:12
【问题描述】:

我正在从事一个 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 sum sas proc


    【解决方案1】:

    我认为合适的工具会使整个过程变得更容易。 SQL 没有处理大量变量的功能。

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

    【讨论】:

    • 绝对是要走的路,除了对 SAS 程序严重过敏的情况。 :)
    【解决方案2】:

    是的,您可以使用宏逻辑并用循环替换您的 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;
    

    【讨论】:

    • 我听到的一个关于 9.5 的谣言是,他们将允许 %do%if 在开放代码中使用,从而无需像这样的宏包装器。
    • @Joe 这听起来像是 SAS 在很长一段时间内发生的最好和最坏的事情。
    • @RobertPenr​​idge 我的想法完全正确。
    【解决方案3】:

    更好的方法(在我看来)是以这种方式使用宏:

    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 宏,但在这里可能有点矫枉过正......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      相关资源
      最近更新 更多