一個更好的方法(在我看來),是使用宏是這樣的:
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宏,但這裏可能會矯枉過正......
來源
2016-06-10 18:15:51
Joe
我聽說9.5的一個謠言是,它們將允許在開放代碼中使用'%do'和'%if',從而不需要像這樣的宏包裝。 – Joe
@Joe聽起來這將是很長一段時間SAS發生的最好和最糟糕的事情。 –
@RobertPenridge我的想法。 – Joe