Hi:
Proc Tabulate is trying to do you a favor by blanking out those row header areas. Most of the time, that's how folks want the report output to look. In the instance where you don't want that particular feature, you have to think outside the box or outside the ODS sandwich.
For example, if you get PROC TABULATE to do all the work of creating your summary information (using ODS OUTPUT), then you could use PROC PRINT on the output dataset from PROC TABULATE and the information for your CLASS1 variable would be on every line (this is example 1 in the code below). An issue with Example 1 is that you no longer have the TABULATE structure with your CLASS3 variables going across the COLUMNS -- I don't know whether that's acceptable to you or not. In my code, REGION is being repeated on every line -- it is the equivalent of your CLASS1 variable.
Or you could use PROC REPORT to generate your crosstabular report using GROUP and ACROSS variables instead of using TABULATE at all. Normally, PROC REPORT tries to do you the same favor that TABULATE does (blanks out repetitious variable values) -- but the good thing with PROC REPORT is that you can COMPUTE a new report column that is based on the values of an existing column. If you grab your variable value of interest at the beginning of a group, then you can assign it to your computed report column as shown in example 2 below.
Note that these examples use SASHELP.SHOES and so you should be able to run the program code. You said that you were "exporting" the data using ODS -- when you use ODS, you are not technically "exporting" (only PROC EXPORT does that), but I figured you were using either ODS HTML or ODS CSVALL to create files (probably for Excel) from your report procedure output. Report procedure output is BASED on data, but is a report about the data -- it could be a summary report, for example, where 1 report row represented the consolidation of many rows of your original data.
If you have further questions about the use of PROC REPORT vs PROC TABULATE, there are excellent examples of both in the SAS documentation and in many books by users available through SAS Publishing. Tech Support can also help you with questions about how both procedures can work to generate the particular report/output you need.
cynthia
[pre]
** Example 1;
ods listing close;
ods output table=work.tabout;
proc tabulate data=sashelp.shoes;
title 'TABULATE directly to data set';
class region product subsidiary;
var sales;
where region = 'Asia';
table region*product,
subsidiary*sales*mean;
run;
ods html3 file='c:\temp\ex1_html.xls' style=sasweb;
ods csvall file='c:\temp\ex1_comma.csv';
proc print data=work.tabout(drop=_table_ _page_ _type_) noobs;
title '1) PRINT on output from proc tabulate';
title2 'But your structure IS different -- this might be OK';
run;
ods _all_ close;
** Example 2;
ods html3 file='c:\temp\ex2_html.xls' style=sasweb;
ods csvall file='c:\temp\ex2_comma.csv';
proc report data=sashelp.shoes
nowd;
where region = 'Asia';
title '2) REPORT on SASHELP.SHOES with ACROSS usage';
column region prtreg product sales,subsidiary;
define region / group noprint;
define prtreg / computed 'Region';
define product / group;
define subsidiary /across ' ';
define sales/ mean ' ';
compute before region;
holdreg = region;
endcomp;
compute prtreg / character length=25;
prtreg = holdreg;
endcomp;
run;
ods _all_ close;
ods listing;
title;
footnote;
[/pre]