[Oracle] 통계함수 ROLLUP() 사용하기
특정 그룹의 합계를 구할때, 그 안에서 원하는 소그룹의 부분합계도 같이 보고 싶다면 편리하게 사용할 수 있다.
사용법 또한 GROUP BY에 추가로 간단하게 사용가능하다.
CUBE와의 차이는 다음글에서 알 수 있다.
다음 글 참고>
사용법>
기본의 그룹바이:
GROUP BY 컬럼1, 컬럼2
-->
ROLLUP 사용할 때:
GROUP BY ROLLUP (컬럼1, 컬럼2)
사용예>
학교에서 1학년(1반, 2반)과 2학년(1반, 2반) 각각의 인원 합과
1학년, 2학년과 전체의 인원수를 계산한다.
쿼리>
WITH TMP_TBL AS (
SELECT
'1' AS SCH_GRADE, '이과' AS TYPE_CLASS, '1' AS SCH_CLASS, 10 AS STUDENT_NUM
FROM DUAL
UNION ALL
SELECT
'1' AS SCH_GRADE, '문과' AS TYPE_CLASS, '2' AS SCH_CLASS, 11 AS STUDENT_NUM
FROM DUAL
UNION ALL
SELECT
'2' AS SCH_GRADE, '이과' AS TYPE_CLASS, '1' AS SCH_CLASS, 20 AS STUDENT_NUM
FROM DUAL
UNION ALL
SELECT
'2' AS SCH_GRADE, '문과' AS TYPE_CLASS, '2' AS SCH_CLASS, 22 AS STUDENT_NUM
FROM DUAL
)
SELECT
SCH_GRADE || CASE WHEN SCH_GRADE IS NOT NULL THEN '학년' ELSE '전체' END AS 학년
, SCH_CLASS || CASE WHEN SCH_CLASS IS NOT NULL THEN '반' END AS 반
, SUM(STUDENT_NUM) || '명' AS 명
FROM TMP_TBL
GROUP BY ROLLUP (SCH_GRADE, SCH_CLASS);
결과>
학년 반 명
1학년 1반 10명
1학년 2반 11명
1학년 21명
2학년 1반 20명
2학년 2반 22명
2학년 42명
전체 63명
출처>
오라클 공식 문서
https://docs.oracle.com/cd/F49540_01/DOC/server.815/a68003/rollup_c.htm
ROLLUP enables a SELECT statement to calculate multiple levels of subtotals across a specified group of dimensions. It also calculates a grand total. ROLLUP is a simple extension to the GROUP BY clause, so its syntax is extremely easy to use. The ROLLUP extension is highly efficient, adding minimal overhead to a query.