Лично я решаю подобные задачи так:
create table a_table
as select 1 id,'vasya' name, 13 amount, to_date('01.01.2006') ins_date from dual
union select 2, 'kolya', 25, to_date('15.01.2006') from dual
union select 3, 'vasya', 44, to_date('20.01.2006') from dual
union select 4, 'vasya', 10, to_date('01.02.2006') from dual
union select 5, 'kolya', 25, to_date('01.02.2006') from dual;
select
a#1
,NAME y#a1
,y#g1
,y#1
,max(y#1) over() y#m
,INS_DATE x#a1
,x#g1
,x#1
,max(x#1) over() x#m
from (
select
sum(AMOUNT) a#1
,grouping(NAME) y#g1
,NAME
,dense_rank() over (order by grouping(NAME),NAME) y#1
,grouping(INS_DATE) x#g1
,INS_DATE
,dense_rank() over (order by grouping(INS_DATE),INS_DATE) x#1
from (
--->>
select ID,NAME,AMOUNT,INS_DATE from CDH_HB.A_TABLE
) group by grouping sets(
(NAME,INS_DATE)
,(INS_DATE)
,(NAME)
,())
) order by y#1 ,x#1;
Посмотрите на результат запроса. Он несет в каждой строке информацию
о размерности матрицы результатов и информацию об одной ячейке результирующего грида, включая и содержимое заголовков столбцов и заголовков строк всех уровней (в данном, простейшем, примере - один уровень группировки по столбцам и один по колонкам.
Остается - только разрисовать тот грид, но это уже - (элементарная) задача других средств .. изобразительных.. Типа: