집계함수라 하면 GROUP BY를 많이 떠올릴 것이다.
하지만 SQL에는 GROUP BY 집계함수와 함께, 해당 그룹을 다시 소그룹으로 나누어 세부항목별 집계연산을 지원하는 별도의 집계함수가 존재한다.
SELECT ~~ (소그룹별 집계할 대상 나열)
FROM ~~
GROUP BY **ROLLUP/CUBE/GROUPING SETS**(세부집계그룹항목)
SELECT PRODUCT_ID, MONTH, SUM(SALES_QUANTITY)
FROM SALES
GROUP BY ROLLUP(PRODUCT_ID, MONTH)
기본적으로 PRODUCT_ID와 MONTH를 그룹화하여 집계한다.
이 집계한 결과를 바탕으로, ROLLUP에서 세부그룹항목으로 기재한 항목중 PRODUCT_ID를 기준으로 세부집계를 진행한다.
최종적으로 PRODUCT_ID와 MONTH 두 항목에 대해 세부집계를 진행한다.
SELECT PRODUCT_ID, MONTH, SUM(SALES_QUANTITY)
FROM SALES
GROUP BY CUBE(PRODUCT_ID, MONTH)
기본적으로 PRODUCT_ID와 MONTH를 그룹화하여 집계한다.
이 집계한 결과를 바탕으로, CUBE에서 세부그룹항목으로 기재한 모든 항목에 대해 각각 세부집계를 진행한다.
최종적으로 PRODUCT_ID와 MONTH 두 항목에 대해 세부집계를 진행한다.
SELECT PRODUCT_ID, MONTH, SUM(SALES_QUANTITY)
FROM SALES
GROUP BY GROUPING SETS(PRODUCT_ID, MONTH)
기본적으로 PRODUCT_ID와 MONTH를 그룹화하여 집계한다.
이 집계한 결과를 바탕으로, GROUPING SETS에서 지정한 세부그룹항목에 대해 각각 세부집계를 진행한다.
SELECT
PRODUCT_ID, MONTH, SUM(SALES_QUANTITY)
,CASE GROUPING(PRODUCT_ID) = 1 THEN '상품ID에 대한 합계' ELSE '-' END AS 상품ID 소계여부
,CASE GROUPING(MONTH) = 1 THEN '월에 대한 합계' ELSE '-' AS 월 소계여부
FROM SALES
GROUP BY ROLLUP(PRODUCT_ID, MONTH)
기본적으로 PRODUCT_ID와 MONTH를 그룹화하여 집계한다.
이 집계한 결과를 바탕으로, 지정한 집계함수 및 세부그룹항목에 대해 각각 세부집계를 진행한다.
세부집계 진행시 GROUPING 조건절에서 지정한 COLUMN명으로 결과를 출력하며, 이 조건절은 GROUPING 키워드를 사용한다(해당 세부집계항목일 경우 1을 반환하고, 아니면 0을 반환).
※ GORUP BY -> 그룹화 대상, GROUPING -> 집계 대상
이 블로그 포스트에 집계함수에 대한 모든 내용이 들어있다 - https://for-my-wealthy-life.tistory.com/44
GROUPING 개념 - https://jhnyang.tistory.com/473