к сожалению, я понятия не имею, как избежать подзапроса здесь
С подзапросом мы можем использовать один трюк - когда мы группируем по G1 и в то же время G1 и G2 имеют отношение 1 к 1 (т.е.равно) это означает, что max (G2) будет равно min (g2), и это условие позволит нам построить предложение where и избавиться от них
Код может быть таким:
select * from
(
SELECT CASE
WHEN GROUPING_ID(G1) = 1 THEN 'Total1' ELSE G1 END as G1,
MIN(g2) as min_g2,
max(g2) as max_g2,
CASE WHEN GROUPING_ID(G2) = 1 THEN 'Total2' ELSE G2 END as G2,
SUM(a) as SUM_A,
SUM(b) as SUM_B,
count(*) as cnt
FROM data
GROUP BY G1, G2
WITH ROLLUP
) t
where
not (min_g2 = max_g2 and g2 = 'Total2')