我有一个如下数据表:
表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。
答案 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
不支持窗口功能。我发现重新合并的聚合有点难以使用,除了在明显的情况下。因此,请使用子查询或join
和group 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(*)
子句。