Oracle
 sql >> Database >  >> RDS >> Oracle

funzione di rollup di Oracle con più colonne

Trovo piuttosto più semplice specificare gli insiemi esatti di cui ho bisogno con la clausola 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),());

Sospetto che sia più efficiente, poiché specifica direttamente i livelli da calcolare.

http://sqlfiddle.com/#!4/8301d/3

CUBE e ROLLUP sono utili per generare automaticamente un numero elevato di livelli di aggregazione (ad es. ogni livello in una gerarchia dimensionale) e potrebbe essere opportuno utilizzare GROUPING ID se si desidera eliminare un piccolo sottoinsieme di livelli da un grande CUBE generato set, ma GROUPING SET è progettato precisamente per specificare livelli di aggregazione particolari.