Je trouve plutôt plus facile de spécifier les ensembles exacts dont j'ai besoin avec la clause GROUPING SET :
WITH data(val1, val2, val3) AS
( SELECT 'a' ,'a-details' ,'1' FROM DUAL
UNION ALL
SELECT 'b' ,'b-details' ,'2' FROM DUAL
UNION ALL
SELECT 'c' ,'c-details' ,'3' FROM DUAL
)
SELECT NVL(val1,'Total Result'),
val2,
SUM(val3) tot
from data
group by grouping sets ((val1, val2),());
Je soupçonne qu'il est plus efficace, car il spécifie directement les niveaux à calculer.
http://sqlfiddle.com/#!4/8301d/3
CUBE et ROLLUP sont pratiques pour générer automatiquement un grand nombre de niveaux d'agrégation (par exemple, chaque niveau d'une hiérarchie dimensionnelle), et il peut être utile d'utiliser GROUPING ID si vous souhaitez éliminer un petit sous-ensemble de niveaux d'un grand CUBE généré ensemble, mais GROUPING SET est précisément conçu pour spécifier des niveaux d'agrégation particuliers.