Я не часто использую ROLLUP, но сложность заключается в том, что после применения ROLLUP нет связи между строками сводки и строками подробностей, поэтому вы не можете легко отсортировать их как группы внутри общего набор результатов, который, как я думаю, вы хотите сделать.
Я думаю, что это даст то, что вы хотите, но это может быть неэффективно для больших наборов данных; по сути, он вычисляет значения промежуточных итогов дважды, один раз с накоплением и один раз с аналитической функцией.
select *
from (select m.col1,
m.col2,
m.col3,
sum(m.col4) sum_c4
from mytable m
group by rollup(m.col1, (m.col2, m.col3))
)
order by case when col1 is null then 1
else 0
end asc, -- put grand total line at end of entire set
sum(sum_c4) over (partition by col1) desc, -- sort subgroups by descending subtotal
col1, -- tiebreaker for subgroups with same total
case when col2 is null then 1
else 0
end asc, -- put subtotal line at end of each group
sum_c4 desc -- put detail lines in descending order