ROLLUP은 단순히 한 개의 컬럼에만 국한되지 않고, 여러 개의 컬럼에 대한 집계도 수행할 수 있어 매우 유용합니다. 다양한 예시를 통해 좀 더 깊이 이해해볼게요.
기본적으로 ROLLUP은 한 컬럼에 대한 그룹별 집계와 그 그룹 전체의 집계를 수행합니다. 이 예시에서는 부서별 평균 급여와 전체 평균 급여를 구합니다.
SELECT 부서, AVG(급여)
FROM 직원
GROUP BY ROLLUP(부서);
결과:
부서 | 평균 급여
---------------------
영업부 | 5000
개발부 | 6000
인사부 | 5500
NULL | 5500 (전체 평균)
두 개 이상의 컬럼을 사용하여 ROLLUP을 하면, 더 세부적인 그룹 집계와 각 단계의 상위 집계를 볼 수 있습니다. 예를 들어, 부서와 직급별로 평균 급여를 구하면서, 각 부서별, 그리고 회사 전체의 평균 급여도 동시에 보고 싶다고 가정해 봅시다.
SELECT 부서, 직급, AVG(급여)
FROM 직원
GROUP BY ROLLUP(부서, 직급);
이 쿼리는 세 단계로 집계를 수행합니다:
1. 부서와 직급별로 집계
2. 부서별 전체 집계
3. 전체 회사의 집계
결과:
부서 | 직급 | 평균 급여
-----------------------------------
영업부 | 사원 | 4000
영업부 | 대리 | 5500
영업부 | NULL | 5000 (영업부 전체 평균)
개발부 | 사원 | 5000
개발부 | 대리 | 7000
개발부 | NULL | 6000 (개발부 전체 평균)
인사부 | 사원 | 5200
인사부 | NULL | 5200 (인사부 전체 평균)
NULL | NULL | 5500 (전체 평균)
직급이 NULL로 표시된 행으로 나옵니다.ROLLUP은 여러 개의 컬럼을 지원하기 때문에, 더 많은 차원의 집계가 가능합니다. 예를 들어, "부서", "직급", 그리고 "연도"를 기준으로 직원들의 평균 급여를 계산할 때도 사용 가능합니다.
SELECT 부서, 직급, 연도, AVG(급여)
FROM 직원
GROUP BY ROLLUP(부서, 직급, 연도);
이 경우에는 네 단계의 집계 결과가 나옵니다:
1. 부서, 직급, 연도별 집계
2. 부서, 직급별 집계 (연도는 무시)
3. 부서별 집계 (직급과 연도를 무시)
4. 전체 집계
결과:
부서 | 직급 | 연도 | 평균 급여
-----------------------------------------
영업부 | 사원 | 2023 | 4000
영업부 | 사원 | 2024 | 4200
영업부 | 사원 | NULL | 4100 (영업부 사원 전체)
영업부 | 대리 | 2023 | 5500
영업부 | 대리 | NULL | 5500 (영업부 대리 전체)
영업부 | NULL | NULL | 4800 (영업부 전체)
개발부 | 사원 | 2023 | 5000
개발부 | 사원 | 2024 | 5200
개발부 | 사원 | NULL | 5100 (개발부 사원 전체)
개발부 | NULL | NULL | 6000 (개발부 전체)
NULL | NULL | NULL | 5400 (전체 평균)
GROUPING 함수와 함께 사용ROLLUP을 사용하면 NULL 값이 많이 발생할 수 있습니다. 이때, GROUPING 함수를 활용해 이 NULL 값이 진짜 데이터에서 나온 NULL인지 아니면 집계 과정에서 생긴 NULL인지를 구분할 수 있습니다.
SELECT 부서, 직급, 연도, GROUPING(부서) AS 부서_집계, GROUPING(직급) AS 직급_집계, AVG(급여)
FROM 직원
GROUP BY ROLLUP(부서, 직급, 연도);
결과:
부서 | 직급 | 연도 | 부서_집계 | 직급_집계 | 평균 급여
-----------------------------------------------------------
영업부 | 사원 | 2023 | 0 | 0 | 4000
영업부 | 사원 | NULL | 0 | 0 | 4100
영업부 | NULL | NULL | 0 | 1 | 4800
NULL | NULL | NULL | 1 | 1 | 5400
GROUPING(부서) 또는 GROUPING(직급)이 1인 행은 집계된 결과라는 뜻입니다.0은 실제 데이터를 나타냅니다.ROLLUP(컬럼1, 컬럼2, ...)는 여러 컬럼을 기준으로 하위 집계와 상위 집계를 모두 포함한 결과를 보여줍니다.GROUPING 함수를 사용하면, 집계에서 발생한 NULL과 실제 데이터의 NULL을 구분할 수 있습니다.이렇게 다양한 경우에 ROLLUP을 사용하여 다차원 집계가 가능합니다.