[英]SAS Enterprise Guide proc sql - using when statements inclusively
I am trying to organize members by years when they were enrolled (in order to calculate retention) but I'm running into an issue.我试图按成员注册的年份来组织成员(以计算保留率),但我遇到了一个问题。 Namely, the code I'm using only assigns one year to each member, whereas I want to know all the years when they were enrolled.也就是说,我使用的代码只为每个成员分配一年,而我想知道他们注册的所有年份。 I need the program to assign more than one year where appropriate (and most members are there for multiple years).我需要该计划在适当的情况下分配超过一年的时间(并且大多数成员在那里工作多年)。
My code is as follows:我的代码如下:
proc sql;
create table tmp7day.ash_yearly_totals as
select prsn_uniq_id,
(case
when min_of_yyyymm < 201501 and max_of_yyyymm > 201312 then 2014
when min_of_yyyymm < 201601 and max_of_yyyymm > 201412 then 2015
when min_of_yyyymm < 201701 and max_of_yyyymm > 201512 then 2016
when min_of_yyyymm < 201801 and max_of_yyyymm > 201612 then 2017
when min_of_yyyymm < 201901 and max_of_yyyymm > 201712 then 2018
when min_of_yyyymm < 202001 and max_of_yyyymm > 201812 then 2019
when min_of_yyyymm < 202101 and max_of_yyyymm > 201912 then 2020
when min_of_yyyymm < 202105 and max_of_yyyymm > 202012 then 202104
else 0
end) as Year
from tmp7day.retention_with_ash
where ash_ind = 1
/*group by year;*/
order by year asc;
quit;
Any suggestions would be appreciated.任何建议,将不胜感激。 Please let me know if my question didn't make sense.如果我的问题没有意义,请告诉我。
There are two solutions to this,有两种解决方法,
Create multiple year variables like year_2014, year_2015,.., year_2021.. etc,.创建多个年份变量,如 year_2014、year_2015、..、year_2021.. 等。 and keep 'Y' in each variable based on different conditions.并根据不同的条件在每个变量中保留“Y”。 (Horizontal data) (横向数据)
Create multiple records per member using output statement.使用输出语句为每个成员创建多个记录。 each record will have respective year in Year variable.每条记录在 Year 变量中都有各自的年份。 (Vertical data) (纵向数据)
Sample Code:示例代码:
data class;
set sashelp.class(firstobs=1 obs=6);
if _n_=1 then do;
min_of_yyyymm=201503;
max_of_yyyymm=201602;
end;
else if _n_=2 then do;
min_of_yyyymm=201403;
max_of_yyyymm=202004;
end;
else if _n_=3 then do;
min_of_yyyymm=201603;
max_of_yyyymm=201804;
end;
else if _n_=4 then do;
min_of_yyyymm=201503;
max_of_yyyymm=201904;
end;
else if _n_=5 then do;
min_of_yyyymm=201603;
max_of_yyyymm=201704;
end;
else if _n_=6 then do;
min_of_yyyymm=201803;
max_of_yyyymm=202104;
end;
run;
/* create seperate record for each year per memner/name/id */
data class1;
set class;
if min_of_yyyymm < 201501 and max_of_yyyymm > 201312 then do; year= 2014;output; end;
if min_of_yyyymm < 201601 and max_of_yyyymm > 201412 then do; year= 2015;output; end;
if min_of_yyyymm < 201701 and max_of_yyyymm > 201512 then do; year= 2016;output; end;
if min_of_yyyymm < 201801 and max_of_yyyymm > 201612 then do; year= 2017;output; end;
if min_of_yyyymm < 201901 and max_of_yyyymm > 201712 then do; year= 2018;output; end;
if min_of_yyyymm < 202001 and max_of_yyyymm > 201812 then do; year= 2019;output; end;
if min_of_yyyymm < 202101 and max_of_yyyymm > 201912 then do; year= 2020;output; end;
if min_of_yyyymm < 202105 and max_of_yyyymm > 202012 then do; year= 202104;output; end;
run;
/* or (more dynamic way, works for any range of years) */
data class2 (drop=i);
set class;
do i=(min_of_yyyymm-mod(min_of_yyyymm,100))/100 to (max_of_yyyymm-mod(max_of_yyyymm,100))/100;
year=i;output;
end;
run;
proc sort data=class2;
by year name;
run;
proc report data=class2;
column year name;
define year/order group;
define name/order;
run;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.