1. ROLLUP : N+1 개를 그룹핑
2. CUBE : 2의 N 제곱개를 그룹핑
-----------------------------------------------------------------------------------
1. GROUP BY ROLLUP(A, B, C)
1-1. A, B, C
1-2. A, B
1-3. A
1-4. 전체
로 그룹핑을 한다.
* 아래 두개의 차이를 확인해보자.
WITH T_TABLE AS
(
SELECT '0001' ITEM, '01' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '01' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '02' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '02' SUBITEM, 30 USE, 3000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '01' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '01' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '02' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALl
SELECT '0002' ITEM, '02' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL
)
SELECT
ITEM
, SUBITEM
, SUM(USE)
, SUM(AMOUNT)
FROM T_TABLE
GROUP BY ROLLUP(ITEM, SUBITEM)
;
WITH T_TABLE AS
(
SELECT '0001' ITEM, '01' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '01' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '02' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '02' SUBITEM, 30 USE, 3000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '01' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '01' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '02' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '02' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL
)
SELECT
ITEM
, SUBITEM
, SUM(USE)
, SUM(AMOUNT)
FROM T_TABLE
GROUP BY ROLLUP((ITEM, SUBITEM))
;
-----------------------------------------------------------------------------------
WITH T_TABLE AS
(
SELECT '0001' ITEM, '01' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '01' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '02' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '02' SUBITEM, 30 USE, 3000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '01' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '01' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '02' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '02' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL
)
SELECT
GROUPING_ID('AVG')
, GROUPING_ID(ITEM)
, ITEM
, GROUPING_ID(SUBITEM)
, SUBITEM
, SUM(USE)
, SUM(AMOUNT)
FROM T_TABLE
GROUP BY ROLLUP('AVG', ITEM, SUBITEM)
;
WITH T_TABLE AS
(
SELECT '0001' ITEM, '01' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '01' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '02' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '02' SUBITEM, 30 USE, 3000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0001' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '01' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '01' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '02' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '02' SUBITEM, 20 USE, 2000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL UNION ALL
SELECT '0002' ITEM, '03' SUBITEM, 10 USE, 1000 AMOUNT FROM DUAL
)
SELECT
DECODE(
ITEM, NULL, DECODE(
GROUPING_ID('AVG'), 1, 'AVG', 'TOTAL'
), ITEM
) ITEM
, DECODE(
GROUPING_ID(ITEM), 1, '', DECODE(
GROUPING_ID(SUBITEM), 1, 'SUBTOTAL', SUBITEM
)
) SUBITEM
, DECODE(
GROUPING_ID('AVG'), 1, AVG(USE),
SUM(USE)
) USE
, DECODE(
GROUPING_ID('AVG'), 1, AVG(AMOUNT),
SUM(AMOUNT)
) AMOUNT
FROM T_TABLE
GROUP BY ROLLUP('AVG', ITEM, SUBITEM)
;
-----------------------------------------------------------------------------------
2. GROUP BY CUBE(A, B, C)
2-1. A, B, C
2-2. A, B
2-3. B, C
2-4, A, C
2-5, A
2-6. B
2-7. C
2-8. 전체
로 그룹핑을 한다.