2016-06-10 133 views
1

我正在開發一個SAS項目,我被要求總結行。 這裏是我的代碼:SAS:在proc sql求和

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?

回答

0

是的,你可以使用宏邏輯來做到這一點,並用循環替換你的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; 
+0

我聽說9.5的一個謠言是,它們將允許在開放代碼中使用'%do'和'%if',從而不需要像這樣的宏包裝。 – Joe

+0

@Joe聽起來這將是很長一段時間SAS發生的最好和最糟糕的事情。 –

+0

@RobertPenr​​idge我的想法。 – Joe

0

一個更好的方法(在我看來),是使用宏是這樣的:

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宏,但這裏可能會矯枉過正......

6

我認爲適當的工具可以使整個過程變得更容易。 SQL沒有處理大量變量列表的功能。

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

絕對要走的路,除了嚴重過敏SAS程序的情況。 :) –