How about something like: data have; length month $3 pcent $10; infile datalines delimiter=','; input permno year month $ pcent $; datalines; 10104,2008,Jan,+5 10104,2008,Feb,-7 10104,2008,Mar,+2 10104,2008,Apr,+3 10104,2009,Jan,-2 10104,2009,Feb,+5 ; run; proc sql; create table WANT as select PERMNO, YEAR, MONTH, case when index(PCENT,"+")>0 then 1.00 + (input(strip(tranwrd(PCENT,"+","")),best.) / 100) else 1.00 - (input(strip(tranwrd(PCENT,"-","")),best.) / 100) end as VAL from WORK.HAVE; quit; data want (drop=lstyear lstpermno); set want; attrib cum_return format=best.; by permno; retain cum_return lstyear lstpermno; if _n_=1 then do; lstpermno=permno; lstyear=year; cum_return=val; end; else if lstyear ne year then do; lstyear=year; cum_return=val; end; else if lstpermno ne permno then do; lstpermno=permno; lstyear=year; cum_return=val; end; else do; cum_return=cum_return * val; end; if last.permno then output; run;
... View more