proc sql语句对与条件匹配的值/行求和

时间:2018-02-07 21:19:25

标签: sql sas

我有一个如下数据表:

表1:

ROWID  PERSONID  YEAR  pidDifference  TIMETOEVENT  DAYSBETVISIT
10      111      2009       .          100            .
110     120      2009        9         10             .
231     120      2009        0         20             10
222     120      2010        0         40             20
221     222      2009       102        10             30
321     222      2009        0         30             20
213     222      2009        0         10             20
432     321      2009        99        10             0
211     432      2009        111       20             10
212     432      2009        0         20             0

我希望仅在每个DAYSBETVISIT的{​​{1}}值为0时才对pidDifference列求和。所以我编写了以下proc sql语句。

PERSONID

但是,我得到的结果并不是在同一proc sql; create table table5 as ( select rowid, YEAR, PERSONID, pidDifference, TIMETOEVENT, DAYSBETVISIT, SUM(CASE WHEN PIDDifference = 0 THEN DaysBetVisit ELSE 0 END) from WORK.Table4_1 group by PERSONID,TIMETOEVENT, YEAR ); quit; DAYSBETVISIT的行中PIDDifference = 0值求和。它只输出与该特定行中PERSONID中存在的值相同的值。

我需要的列(sumdays)但是没有上面的语句(使用上面的语句显示结果列为OUT:

DAYSBETVISIT

我不知道我做错了什么。

我使用的是SAS EG版本7.15,Base SAS版本9.4。

2 个答案:

答案 0 :(得分:1)

对于您的示例数据,您似乎只需要使用两个CASE语句。一个用于定义哪些值为SUM(),另一个用于定义是否报告SUM。

proc sql ;
 select personid, piddifference, daysbetvisit, sumdays
      , case when piddifference = 0
             then sum(case when piddifference=0 then daysbetvisit else 0 end)
        else 0 end as WANT
 from expect
 group by personid
 ;
quit;

结果

                   pid
PERSONID    Difference  DAYSBETVISIT   sumdays      WANT
--------------------------------------------------------
     111             .             .         0         0
     120             0            10        30        30
     120             0            20        30        30
     120             9             .         0         0
     222             0            20        40        40
     222             0            20        40        40
     222           102            30         0         0
     321            99             0         0         0
     432             0             0         0         0
     432           111            10         0         0

答案 1 :(得分:0)

SAS proc sql不支持窗口功能。我发现重新合并的聚合有点难以使用,除了在明显的情况下。因此,请使用子查询或joingroup by

proc sql;
create table table5 as
   select t.rowid, t.YEAR, t.PERSONID, t.pidDifference, t.TIMETOEVENT, t.DAYSBETVISIT,
          tt.sum_DaysBetVisit
   from WORK.Table4_1 t left join
        (select personid, sum(DaysBetVisit) as sum_DaysBetVisit
         from WORK.Table4_1
         group by personid
         having min(pidDifference) = max(pidDifference) and min(pidDifference) = 0
        ) tt
        on tt.personid = t.personid;

注意:这不会处理NULL的{​​{1}}值。如果这是一个问题,您可以将pidDifference添加到count(pidDifference) = count(*)子句。