WITH t AS ( SELECT 'A' cd, 1 v FROM dual UNION ALL SELECT 'A', 1 FROM dual UNION ALL SELECT 'B', 2 FROM dual UNION ALL SELECT 'B', 2 FROM dual UNION ALL SELECT 'C', 3 FROM dual UNION ALL SELECT 'C', 3 FROM dual ) SELECT cd , DECODE(GROUPING(cd), 0, SUM(v), SUM(DECODE(cd, 'B', 0, v))) s FROM t GROUP BY ROLLUP(cd) ;