data a;
input a $1. date $13. b $8.;
datalines;
A 2011.6.30 xxx
A 2011.12.31 yyy
B 2011.12.31 zzz
B 2012.6.30 ttt
;
run;
data a;
set a;
year=input(substr(date,1,4),4.);
month=input(substr(date,find(date,'.')+1,find(date,'.',find(date,'.')+1)-find(date,'.')),4.);
lag_year=lag(year);
lag_month=lag(month);
lag_a=lag(a);
lag_b=lag(b);
run;
proc sort data=a;
by a year month b;
run;
data a;
set a end=end;
if a=lag_a then do;
if year-lag_year=0 then do month1=lag_month to month;
year1=year;
if month1=lag_month then b1=lag_b;
else if month1=month then b1=b;
else b1='';
output;
end;
else do year1=lag_year to year;
if year1=lag_year then do month1=lag_month to 12;
if month1=lag_month then b1=lag_b;
else b1='';
output;
end;
else if year1=year then do month1=1 to month;
if month1=month then b1=b;
else b1='';
output;
end;
else do month1=1 to 12;
b1='';
output;
end;
end;
end;
keep a b1 month1 year1;
rename month1=month year1=year b1=b;
run;
data b;
retain a date1 b;
length b $3. date1 $10.;
set a;
date=mdy(input(substr(compress(put(mdy(month,1,year)+31,yymmdd10.),'- '),5,2),2.),1,input(substr(compress(put(mdy(month,1,year)+31,yymmdd10.),'- '),1,4),4.))-1;
date1=compress(substr(compress(put(date,yymmdd10.)),1,4)||'.'||substr(compress(put(date,yymmdd10.)),6,2)||'.'||substr(compress(put(date,yymmdd10.)),9,2));
keep a b date1;
rename date1=date;
run;