You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:17:54