Du castest ja nur die Zwischenergebnisse und nicht das Endergebnis.
Lass die Zwischencasts mal weg und caste das Endergebnis:

decimal(sum ....., 11, 2)

Berücksichtige dazu das max. mögliche Ergebnis um einen Überlauf auszuschließen.
Dazu kommt noch, wie deine sonstigen Programme noch runden, also auf welchem Zwischenergebnis.
Gerade bei Prozenten kann das nicht so unerheblich werden.

SQL stellt dir die Funktion ROUND(Wert, Stellen) zur Verfügung.
Dann kannst du das casten ganz sein lassen, da dies nur zum Abschneiden des Wertes führt, Beispiel:

round(STS / 100.00 * RAB, 2)

sum(round(....., 2))

round(sum(....), 2)

Je nach Ziel des Ergebnisses.