You can use CALL DEFINE to change the format attached to column(s).
Here is example using your existing dataset:
data have ;
input Name &$ (Title Dept Category) ($) EOD1201 EOD1202 EOD1203 EOD1204 EOD1205 Change ;
cards;
Doe, John CEO DEP AMR 5 6 10 12 15 3
Doe, Jan VP RSK Ratio .23 .25 .75 .88 .25 0
Smith, Bob SVP SMB MDR 7 8 9 9 9 0
Smith, Mike Associate CHK SUB 6 6 8 8 7 1
;
proc report data=have;
column Name Title Dept Category EOD1201 EOD1202 EOD1203 EOD1204 EOD1205 Change;
compute change ;
if category='Ratio' then do col=5 to 10;
call define(col,'format','percent8.');
end;
endcomp;
run;
To make it more dynamic change the structure of the dataset so that the values EOD1201, EOD1202, etc are in a variable instead of in the metadata. For example you could use PROC TRANPOSE on your current data.
proc transpose data=have out=tall ;
by name--category notsorted;
var _numeric_;
run;
Now you can use _NAME_ as an across variable.
proc report data=tall;
column Name Title Dept Category col1,_name_ ;
define name--category / group order=data ;
define _name_ / across order=data ' ';
define col1 / sum ' ' width=8 ;
compute col1 ;
if category='Ratio' then call define(_col_,'format','percent8.');
endcomp;
run;
Results:
Name Title Dept Category EOD1201 EOD1202 EOD1203 EOD1204 EOD1205 Change
Doe, Joh CEO DEP AMR 5 6 10 12 15 3
Doe, Jan VP RSK Ratio 23% 25% 75% 88% 25% 0%
Smith, B SVP SMB MDR 7 8 9 9 9 0
Smith, M Associat CHK SUB 6 6 8 8 7 1
... View more