Hi:
  This really isn't a rotated header, so much as a "put every character in the header on a separate line" solution. Basically, you put a "line feed" between every character in the spanning header. Proc Report will do a spanning header for you. See #1 report. Then, using ODS ESCAPECHAR, you can put a line feed between every letter in the header. See #2 report. The "line feed" is the ODS ESCAPECHAR + n...so if ESCAPECHAR is ^, then ^n is the line feed.
 
  Tech Support may have some other ideas. This is sort of the "brute force" method.
 
cynthia
[pre]
ods pdf file='fake_vertical1.pdf';
  ods escapechar='^';
  proc report data=sashelp.class nowd;
    title '1) Make Spanning Header -- not vertical';
    column ('SPAN - HDR' name age height weight sex) x y z;
    define name / order 'Name';
    define age / order 'Age';
    define height / sum;
    define weight / sum;
    define sex / display;
    define x / computed 'X';
    define y /computed 'Y';
    define z / computed 'Z';
    compute x;
      x = age * 100 + height.sum;
    endcomp;
    compute y;
      y = age * 25 + weight.sum;
    endcomp;
    compute z;
      z = age * 73 + height.sum + weight.sum;
    endcomp;
run;
ods pdf close;
                                
ods pdf file='fake_vertical2.pdf';
  ods escapechar='^';
  proc report data=sashelp.class nowd;
    title '2) Use line feed between each character';
    column ('S^nP^nA^nN^n-^nH^nD^nR' name age height weight sex) x y z;
    define name / order 'Name';
    define age / order 'Age';
    define height / sum;
    define weight / sum;
    define sex / display;
    define x / computed 'X';
    define y /computed 'Y';
    define z / computed 'Z';
    compute x;
      x = age * 100 + height.sum;
    endcomp;
    compute y;
      y = age * 25 + weight.sum;
    endcomp;
    compute z;
      z = age * 73 + height.sum + weight.sum;
    endcomp;
run;
ods pdf close;
[/pre]