[SQL] GROUPING, GROUP BY ROLLUP - 애증의 롤업(2)

Yuri Lee·2024년 10월 15일
1

SQL

목록 보기
9/10

ROLLUP은 단순히 한 개의 컬럼에만 국한되지 않고, 여러 개의 컬럼에 대한 집계도 수행할 수 있어 매우 유용합니다. 다양한 예시를 통해 좀 더 깊이 이해해볼게요.

1. 단일 컬럼 ROLLUP

기본적으로 ROLLUP은 한 컬럼에 대한 그룹별 집계와 그 그룹 전체의 집계를 수행합니다. 이 예시에서는 부서별 평균 급여와 전체 평균 급여를 구합니다.

SELECT 부서, AVG(급여)
FROM 직원
GROUP BY ROLLUP(부서);

결과:

부서      | 평균 급여
---------------------
영업부    | 5000
개발부    | 6000
인사부    | 5500
NULL     | 5500 (전체 평균)

2. 다중 컬럼 ROLLUP

두 개 이상의 컬럼을 사용하여 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로 표시된 행으로 나옵니다.
  • 마지막으로, 전체 회사의 평균이 출력됩니다.

3. 세 개 이상의 컬럼 사용

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 (전체 평균)

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

profile
유리

0개의 댓글