Proc SQL按条件分组求和异常:PERSONID内pidDifference=0时DAYSBETVISIT求和失败
解决SAS Proc SQL按PERSONID求和指定条件行的问题
嘿,我来帮你搞定这个求和的问题!你想要的是针对每个PERSONID,只对pidDifference=0的行的DAYSBETVISIT列求和,但当前的SQL语句没实现分组汇总,反而返回了原行值——大概率是因为没正确使用分组或者条件筛选的方式不对。
方法1:仅输出每个PERSONID的求和结果
如果你只需要每个PERSONID对应的符合条件的总和,用带GROUP BY的Proc SQL写法就行,核心是用CASE WHEN限定求和的范围:
PROC SQL; CREATE TABLE sum_result AS SELECT PERSONID, SUM(CASE WHEN pidDifference = 0 THEN DAYSBETVISIT ELSE 0 END) AS sumdays FROM Table1 GROUP BY PERSONID; QUIT;
- 这里
CASE WHEN会把pidDifference≠0的行的DAYSBETVISIT转为0,不影响求和结果 GROUP BY PERSONID确保按每个ID单独汇总,最终每个ID只会返回一行对应的sumdays
方法2:保留原表所有行并新增求和列
如果你想保留原表的所有数据,同时给每一行加上对应PERSONID的求和结果,可以用子查询或者窗口函数:
子查询方式
PROC SQL; CREATE TABLE result_with_sum AS SELECT t1.*, (SELECT SUM(DAYSBETVISIT) FROM Table1 t2 WHERE t2.PERSONID = t1.PERSONID AND t2.pidDifference = 0) AS sumdays FROM Table1 t1; QUIT;
窗口函数方式(更简洁)
PROC SQL; CREATE TABLE result_with_sum AS SELECT *, SUM(CASE WHEN pidDifference = 0 THEN DAYSBETVISIT ELSE 0 END) OVER (PARTITION BY PERSONID) AS sumdays FROM Table1; QUIT;
这两种写法会让原表的每一行都显示对应PERSONID的sumdays值,适合需要保留原始明细的场景。
你可能踩的坑
如果你的原语句没得到正确结果,常见原因包括:
- 没加
GROUP BY PERSONID:导致SQL不会按ID分组,只会返回所有符合条件的行的总和(单一行)或者原行值 - 把
pidDifference=0放在WHERE里但没分组:会过滤掉不符合条件的行,但不会汇总,返回的还是过滤后的明细行 - 直接用
SUM(DAYSBETVISIT)没加条件:会把该ID下所有行的DAYSBETVISIT都算进去,不符合你的需求
内容的提问来源于stack exchange,提问作者Mray
相关产品推荐
相关产品推荐

