If you have big enough memory to hold the whole table, then you can try this: data have; input a b c; cards; 1 2 3 4 5 6 7 8 9 ; run; proc sql NOPRINT; select nobs into :nobs TRIMMED from dictionary.tables where LIBNAME='WORK' AND MEMNAME='HAVE'; SELECT NVAR INTO :NVAR TRIMMED FROM DICTIONARY.TABLES WHERE LIBNAME='WORK' AND MEMNAME='HAVE'; QUIT; data want; set have end=last nobs=nobs; array t1 a b c; array t2(&nobs,&nvar) _temporary_; do over t1; t2(_n_,_i_)=t1; end; if last then do; do _n_=1 to nobs; do over t1; t1=t2(_i_,_n_); end; output; end; end; run; Note: if your nobs not equal to your nvar, then the code needs to be tweaked a bit, basically you would need to define another array for the new vars. Haikuo
... View more