Setup for ROLLUP and CUBE
ROLLUP and CUBE are used very rarely in our traditional OLTP systems.But it is always better to have such functions up your sleeves.They may be asked in interviews.
The examples in this article will be run against the following simple dimension table.
DROP TABLE dimension_tab; CREATE TABLE dimension_tab ( fact_1_id NUMBER NOT NULL, fact_2_id NUMBER NOT NULL, fact_3_id NUMBER NOT NULL, fact_4_id NUMBER NOT NULL, sales_value NUMBER(10,2) NOT NULL ); INSERT INTO dimension_tab SELECT TRUNC(DBMS_RANDOM.value(low => 1, high => 3)) AS fact_1_id, TRUNC(DBMS_RANDOM.value(low => 1, high => 6)) AS fact_2_id, TRUNC(DBMS_RANDOM.value(low => 1, high => 11)) AS fact_3_id, TRUNC(DBMS_RANDOM.value(low => 1, high => 11)) AS fact_4_id, ROUND(DBMS_RANDOM.value(low => 1, high => 100), 2) AS sales_value FROM dual CONNECT BY level <= 1000; COMMIT;
ROLLUP
In addition to the regular aggregation results we expect from the GROUP BY
clause, the ROLLUP
extension produces group subtotals from right to left and a grand total. If “n” is the number of columns listed in theROLLUP
, there will be n+1 levels of subtotals.
SELECT fact_1_id, fact_2_id, SUM(sales_value) AS sales_value FROM dimension_tab GROUP BY ROLLUP (fact_1_id, fact_2_id) ORDER BY fact_1_id, fact_2_id; FACT_1_ID FACT_2_ID SALES_VALUE ---------- ---------- ----------- 1 1 4363.55 1 2 4794.76 1 3 4718.25 1 4 5387.45 1 5 5027.34 1 24291.35 2 1 5652.84 2 2 4583.02 2 3 5555.77 2 4 5936.67 2 5 4508.74 2 26237.04 50528.39 13 rows selected.
CUBE
In addition to the subtotals generated by the ROLLUP
extension, the CUBE
extension will generate subtotals for all combinations of the dimensions specified. If “n” is the number of columns listed in the CUBE
, there will be 2n subtotal combinations.
SELECT fact_1_id, fact_2_id, SUM(sales_value) AS sales_value FROM dimension_tab GROUP BY CUBE (fact_1_id, fact_2_id) ORDER BY fact_1_id, fact_2_id; FACT_1_ID FACT_2_ID SALES_VALUE ---------- ---------- ----------- 1 1 4363.55 1 2 4794.76 1 3 4718.25 1 4 5387.45 1 5 5027.34 1 24291.35 2 1 5652.84 2 2 4583.02 2 3 5555.77 2 4 5936.67 2 5 4508.74 2 26237.04 1 10016.39 2 9377.78 3 10274.02 4 11324.12 5 9536.08 50528.39 18 rows selected. SQL>
Top Posts
- RANK, DENSE_RANK, FIRST and LAST Analytic Functions
- Partitioned Tables And Indexes in Oracle
- GROUP BY Functions in Oracle
- PIVOT Function in Oracle
- Cardinality and Index in Oracle
- Oracle Architecture – SQL Query Processing