Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

função de rollup oracle com várias colunas


Acho muito mais fácil especificar os conjuntos exatos que preciso com a cláusula 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),());

Suspeito que seja mais eficiente, pois especifica diretamente os níveis a serem calculados.

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

CUBE e ROLLUP são úteis para gerar um grande número de níveis de agregação automaticamente (por exemplo, todos os níveis em uma hierarquia dimensional), e pode haver um caso para usar GROUPING ID se você quiser eliminar um pequeno subconjunto de níveis de um grande CUBE gerado set, mas GROUPING SET foi projetado precisamente para especificar níveis de agregação específicos.