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
을 사용하여 다차원 집계가 가능합니다.