Summe einer "computed" Spalte

Hallo zusammen,

weil ich regelmäßig mit Berichten arbeite, will ich diese mit PROC REPORT anstatt SQL oder SUMMARY erstellen. Viele Sachen funktionieren gut, aber wenn ich die Summe einer berechneten (im PROC REPORT computed) Spalte berechnen will, ergibt es Missing. Es liegt daran, dass ich eine Spalte, mit der ich rechne, nicht summiere, und deshalb ergibt sich dadurch ein Missing.
Hier sind Beispieldaten und der Code dazu. Das Problem liegt an der letzten Zeile der letzten Spalte in der erzeugten Tabelle.

data test;
    
infile datalines dsd delimiter=',';
    
input Geschlecht $ Jahr Anzahl06 Anzahl07 Bewertung;
    
datalines;
M,2007,34,32,10
W,2006,15,19,2
M,2006,11,13,9
W,2007,18,24,3
W,2007,56,32,11
;

title;
proc report data = test;
    
column Geschlecht Anzahl06,(sum pctsum) Anzahl07,(sum pctsum) Bewertung diff;
    
define Geschlecht / display 'Attribute des Merkmals';
    
define Jahr / group;
    
define Anzahl / analysis sum 'Anzahl' format=commax10.;
    
define sum / 'Anzahl';
    
define pctsum / 'Anteil' format=percent10.2;
    
define Bewertung / display 'Bewertung';
    
define diff /computed 'Unterschied' format=PCNT10X.;
    
define multi / computed 'Berechnet';
    
compute diff;
        diff=Anzahl07.pctsum-Anzahl06.pctsum;
        
if diff < 0 then
        
call define(_col_,'style','style=[foreground=white background=red]');
        
if diff = 0 then
        
call define(_col_,'style','style=[foreground=white background=white]');
        
if diff > 0 then
        
call define(_col_,'style','style=[foreground=black background=green]');
    
endcomp;
    
compute multi;
        multi=diff*Bewertung;
    
endcomp;
    
rbreak after / dol summarize;
quit;run;

Vielen Dank schon im Voraus.

Mit freundlichen Grüßen
Melinda Bede

kein Missing, sondern weiß auf weiß

Es ergibt sich für die letzte Zeile in der letzten Spalte der Wert 0 (100% - 100%). Sie haben angegeben, dass Vordergrund und Hintergrund weiß sein sollen, wenn der Wert 0 ist. Genau so sieht es dann auch aus: weiß auf weiß sieht aus wie eine leere Zelle.

Ich habe etwas vergessen

Hallo Herr Mangold,

das ist richtig, was Sie geschrieben haben (so wollte ich das nähmlich haben), ich habe aber etwas vergessen.
Es fehlt eine Spalte 'multi' und da gibt es Probleme:

title;
proc report data = test;
    
column Geschlecht Anzahl06,(sum pctsum) Anzahl07,(sum pctsum) Bewertung diff multi;
Wenn Sie das Programm nochmal abschicken, dann sehen Sie, was das Problem ist.

Mit freundlichen Grüßen,
Melinda Bede

Was soll denn dort stehen?

In der Summenzeile für diese Spalte multi sollte dann immer 0 stehen, oder?

Summe soll dort stehen

In der fertigen Tabelle soll die Spalte "Bewertung" nicht aufsummiert werden, sie sind nähmlich feste Werte, und die Summe in diesem Fall hat keine Bedeutung. Die Summe der Spalte diff ergibt immer Null (diese Summe ist für mich ebenfalls irrelevant, deshalb sind Nullwerte mit weißem Hinter-bzw. Fordergrund kodiert). Die Spalte diff ist die wichtigste, vor allem die Spaltensumme. In dem Datensatz muss es ca. -1,017 ergeben. Diese Funktion kann ich aber aus irgendeinem Grund nicht anwenden, SAS will die Spaltensummen von Bewertung und Unterschied multiplizieren und das ergibt logischerweise Missing, weil die Spaltensumme von Bewertung Missing ist.
Ich hoffe, dass ich das Problem ausführlich beschreiben konnte.
Noch eine Anmerkung: das Format von diff sollte eigentlich Prozent sein, also

format=percent10.2
und nicht wie vorgegeben
format=PCNT10X.
(das war ein benutzerdefiniertes Format).

verdeckte Variable

Man kann das durch eine verdeckte Variable lösen.
Ersetzen Sie in Ihrem Beispiel den COMPUTE-Block für multi durch folgenden Block:

compute multi;
   if upcase(_break_) = '_RBREAK_' then do;
      multi = multisum;
   end;
   else do;
      multi=diff*Bewertung;
      multisum+multi;
   end;
endcomp;

Hier wird in den Detailzeilen die Variable multi in der neuen (verdeckten, d.h. nicht angezeigten) Variablen multisum aufsummiert und in der Summenzeile ausgegeben. Über die automatische Variable _break_ kann man abfragen, ob gerade eine Summenzeile verarbeitet wird.