簡體   English   中英

SAS Enterprise Guide proc sql - 使用 when 語句包含在內

[英]SAS Enterprise Guide proc sql - using when statements inclusively

我試圖按成員注冊的年份來組織成員(以計算保留率),但我遇到了一個問題。 也就是說,我使用的代碼只為每個成員分配一年,而我想知道他們注冊的所有年份。 我需要該計划在適當的情況下分配超過一年的時間(並且大多數成員在那里工作多年)。

我的代碼如下:

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;

任何建議,將不勝感激。 如果我的問題沒有意義,請告訴我。

有兩種解決方法,

  1. 創建多個年份變量,如 year_2014、year_2015、..、year_2021.. 等。 並根據不同的條件在每個變量中保留“Y”。 (橫向數據)

  2. 使用輸出語句為每個成員創建多個記錄。 每條記錄在 Year 變量中都有各自的年份。 (縱向數據)

示例代碼:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM