sql >> Base de Datos >  >> RDS >> Oracle

función de acumulación de Oracle con varias columnas

Me resulta bastante más fácil especificar los conjuntos exactos que necesito con la 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),());

Sospecho que es más eficiente, ya que especifica directamente los niveles a calcular.

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

CUBE y ROLLUP son útiles para generar una gran cantidad de niveles de agregación automáticamente (p. ej., todos los niveles en una jerarquía dimensional), y podría haber un caso para usar GROUPING ID si desea eliminar un pequeño subconjunto de niveles de una gran cantidad generada por CUBE. conjunto, pero GROUPING SET está diseñado precisamente para especificar niveles de agregación particulares.