如何在SAS Proc SQL中批量定义SUM函数参数实现增量汇总?
解决方案
方法1:使用SAS宏自动生成SUM语句
通过宏循环自动生成所有sum(cmrN) as bads_N语句,无需手动逐个编写,还能灵活扩展变量数量:
%let var_count = 4; /* 这里指定cmr变量的数量,比如要扩展到cmr10就改成10 */ proc sql; create table summary_cmr as select distinct reporting_date %do i = 1 %to &var_count; , sum(cmr&i) as bads_&i %end; from have group by 1; quit;
方法2:使用PROC SUMMARY批量汇总再转置
利用PROC SUMMARY的分组汇总功能批量处理cmr变量,再通过PROC TRANSPOSE转成目标宽表:
/* 第一步:批量计算每个cmr变量的分组和 */ proc summary data=have nway; class reporting_date; var cmr1-cmr4; /* 指定要汇总的变量范围 */ output out=sum_temp sum=; run; /* 第二步:转置为目标格式 */ proc transpose data=sum_temp out=summary_cmr (drop=_name_) prefix=bads_; by reporting_date; var cmr1-cmr4; run;
方法3:数据步结合数组实现分组求和
在数据步中用数组遍历cmr变量,按reporting_date分组累加求和,最后输出宽表:
proc sort data=have; by reporting_date; run; data summary_cmr; set have; by reporting_date; array cmr[4] cmr1-cmr4; array bads[4] bads_1-bads_4; /* 分组初始化累加变量 */ if first.reporting_date then do; do i=1 to 4; bads[i] = 0; end; end; /* 累加求和 */ do i=1 to 4; bads[i] + cmr[i]; end; /* 仅保留每组最后一条汇总记录 */ if last.reporting_date then output; keep reporting_date bads_1-bads_4; run;
内容的提问来源于stack exchange,提问作者useRR12
相关产品推荐
相关产品推荐

