The fact is, if you do not have a specific combination in your database, how could the engine include this combination in the results? To have all the combinations in the results, you need to have all the combinations available, whether in the main table or in some other table used for links. For example, you can create another table R with the following data:
A | B | C ------------ A1 | B1 | C1 A1 | B1 | C2 A1 | B2 | C1 A1 | B2 | C2 A2 | B1 | C1 A2 | B1 | C2 A2 | B2 | C1 A2 | B2 | C2 A3 | B1 | C1 A3 | B1 | C2 A3 | B1 | C1 A3 | B2 | C2 ...
And then your request will look like this:
SELECT r.*, COUNT(td), coalesce(SUM(td), 0) FROM r LEFT OUTER JOIN t on (ra=ta and rb=tb and rc=tc) GROUP BY ra, rb, rc ORDER BY ra, rb, rc
This will return you the set you want with 0 | 0 0 | 0 for a combination that does not exist in the main table. Please note that this is only possible if you know all the possible combinations that you want to include, which may not always be the case.
If, on the other hand, your A, B, C are numeric values, and you just want to include all the numbers in the range, then there might be another way to handle this, something like this:
SELECT an, bn, cn, COUNT(td), coalesce(SUM(td), 0) FROM (SELECT (rownum) "n" FROM DUAL WHERE LEVEL >= start_a CONNECT BY LEVEL <= end_a) a, (SELECT (rownum) "n" FROM DUAL WHERE LEVEL >= start_b CONNECT BY LEVEL <= end_b) b, (SELECT (rownum) "n" FROM DUAL WHERE LEVEL >= start_c CONNECT BY LEVEL <= end_c) c, t WHERE an = ta(+) AND bn = tb(+) AND cn = tc(+) GROUP BY an, bn, cn ORDER BY an, bn, cn
(I do not have an Oracle instance to test this, so this is more of a somewhat enlightened guess than anything else.)
The bottom line is that the engine must know what to include in the final results - one way or another.