You need to do this in the query rather than the report, because, assuming the report is based on a repeating frame and that frame is bound to a group from the query, then if the query doesn't return a particular group value, the report formatter won't know about that value.
Write your query so that it returns all categories, using a left outer join to get the details within each category. For example, instead of
SELECT c.code, c.name, d.desc, d.amount
FROM cat c, dtl d
WHERE c.code = d.cat
use
SELECT c.code, c.name, d.desc, d.amount
FROM cat c, dtl d(+)
WHERE c.code = d.cat
(I think that is correct syntax for an Oracle left join, but as I said it's been a while - look it up in the Oracle documentation if you don't already know it.)
Hope this helps.