Один из подходов заключается в том, чтобы поместить текущий запрос в CTE, а затем генерировать названия отделов, только когда это первая запись в группе:
WITH cte AS (
SELECT
DECODE(GROUPING(d.dname), 1, 'All Departments', d.dname) AS dname,
DECODE(GROUPING(job), 1, 'All Jobs', job) AS job,
COUNT(*) "Total Empl",
AVG(sal) * 12 "Average Sal",
ROW_NUMBER() OVER (PARTITION BY DECODE(GROUPING(d.dname), 1, 'All Departments', d.dname)
ORDER BY DECODE(GROUPING(job), 1, 'All Jobs', job)) rn
FROM emp e
INNER JOIN dept d
ON d.deptno = e.deptno
GROUP BY ROLLUP (dname, job)
)
SELECT
CASE WHEN rn = 1 THEN dname ELSE '' END AS dname,
job,
"Total Empl",
"Average Sal"
FROM cte
ORDER BY
dname,
job;
Хотя это может соответствовать вашим ожиданиям, например,Проблемы с презентациями обычно лучше всего решать на уровне представления, например, что-то вроде PHP.