SAS按customer_no、plan、plan_total分组计算字段总和问题求助
问题原因
你当前的代码无法得到分组总和有三个核心问题:
- SAS的DATA步默认逐行读取数据时,会自动重置变量值,没有保留上一行的计算结果,无法实现跨行累加
sum(plan_total)仅传入单个参数时,函数直接返回该参数本身的值,没有求和效果,所以只能拿到当前行的plan_total数值- 原有代码给sum_a/sum_b/sum_c赋值字符串
"0",会让变量被定义为字符类型,后续做数值计算会出现隐式转换报错。
解决方案
方案1:用PROC SQL实现(逻辑最直观)
proc sql; create table cust as select customer_no, plan, /* 按需把plan_total也加入select列和group by即可 */ sum(case when type_a='1' then plan_total else 0 end) as sum_a format=best12., sum(case when type_b='1' then plan_total else 0 end) as sum_b format=best12., sum(case when type_c='1' then plan_total else 0 end) as sum_c format=best12. from cust_det /* 分组维度,需要加plan_total就直接补充到后面 */ group by customer_no, plan; quit;
方案2:用DATA步实现(适合需要逐行处理的场景)
/* 先按分组维度排序,必须和后续分组逻辑一致 */ proc sort data=cust_det; by customer_no plan; run; data cust; set cust_det; by customer_no plan; /* 声明变量需要保留上一行的计算结果,不被自动重置 */ retain sum_a sum_b sum_c; /* 每个新分组的第一行先重置累加值为0 */ if first.plan then do; sum_a = 0; sum_b = 0; sum_c = 0; end; /* 逐行累加对应类型的金额 */ if type_a='1' then sum_a + plan_total; if type_b='1' then sum_b + plan_total; if type_c='1' then sum_c + plan_total; /* 如果需要保留原表所有行、每行都附带分组总和,删掉下面这行即可 */ if last.plan then output; run;
结果对比


内容的提问来源于stack exchange,提问作者michelle
相关产品推荐
相关产品推荐

