sql >> Databasteknik >  >> RDS >> Oracle

Oracle rollup-funktion med flera kolumner

Jag tycker att det är ganska lättare att specificera de exakta uppsättningarna jag behöver med GROUPING SET-satsen:

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),());

Jag misstänker att det är mer effektivt, eftersom det direkt specificerar nivåerna som ska beräknas.

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

CUBE och ROLLUP är praktiska för att generera ett stort antal aggregeringsnivåer automatiskt (t.ex. varje nivå i en dimensionshierarki), och det kan finnas ett fall för att använda GROUPING ID om du vill eliminera en liten delmängd av nivåer från en stor CUBE-genererad set, men GROUPING SET är exakt utformad för att specificera särskilda aggregeringsnivåer.



  1. Ska jag koppla från() om jag använder Apache::DBIs connect_cached()?

  2. Lägg till en numrerad listkolumn till en returnerad MySQL-fråga

  3. Visa SQL-fråga för kontroller

  4. SQL kapslad underfråga som refererar till farföräldrar-kolumnen