그룹화 확장 기능 GROUPING SETS, ROLLUP, CUBE 정리
해당 포스팅에서는 'GROUP BY' 절을 확장하여 다양한 방식으로 데이터를 그룹화할 수 있도록 해주는 기능인 'GROUPING SETS', 'ROLLUP', 'CUBE'에 대해서 살펴보겠습니다.
실무에서는 사용해 본 적이 없으나 이번에 SQLD 자격증 공부 과정에서 이러한 기능이 있다는 것을 알게 되었으며, 각 기능에 대한 설명과 예시를 통해 이해하기 쉽도록 정리해 보았습니다.
GROUPING SETS 내용 및 예시
SELECT EMP_NO, null, SUM(SAL) -- 사원번호(EMP_NO) 기준 그룹화된 급여 합계
FROM SALARIES
GROUP BY EMP_NO
UNION
SELECT null, PAYMENT_MONTH, SUM(SAL) -- 지급 년월(PAYMENT_MONTH) 기준 그룹화된 급여 합계
FROM SALARIES
GROUP BY PAYMENT_MONTH;
예를 들어 '급여 지급 내역 테이블(SALARIES)'에서 사원 번호(EMP_NO)를 기준으로 그룹핑한 급여 합계 데이터와 지급년월(PAYMENT_MONTH)을 기준으로 그룹핑한 급여 합계 데이터를 한 번에 조회하고 싶을 경우, 사원번호와 지급년월을 기준으로 각각 'GROUP BY'를 사용한 데이터를 UNION을 통해 합쳐볼 수 있는데요.
이와 같은 경우 'GROUPING SETS' 기능을 사용하면 아래와 같이 하나의 쿼리로 동일한 결과를 조회할 수 있습니다.
-- GROUPING SETS 사용 예시
SELECT EMP_NO, PAYMENT_MONTH, SUM(SAL)
FROM SALARIES
GROUP BY GROUPING SETS(EMP_NO, PAYMENT_MONTH);
이처럼 'GROUPING SETS'는 여러 GROUP BY 절을 하나의 쿼리로 작성할 수 있게 해 주며, 이 기능을 사용하면 서로 다른 그룹화 조합을 한 번에 조회할 수 있습니다.
추가로 'GROUPING SETS'의 경우 지정된 컬럼의 순서를 바꾸어도 결과에 영향을 받지 않는다는 특징이 있습니다.
ROLLUP 내용 및 예시
GROUP BY ROLLUP(A, B);
-- A, A+B, () 기준 그룹화된 집계 생성 / (): 전체를 의미
'ROLLUP'의 경우 그룹화된 데이터를 계층적으로 집계하는 기능입니다.
지정된 컬럼 목록의 순서에 따라 점진적으로 집계를 수행하며, 각 단계별 집계 및 총 집계 데이터를 생성합니다.
위 'ROLLUP(A, B)' 쿼리를 기준으로 설명하자면, 'A' 기준의 그룹화된 집계 + 'A, B' 기준의 그룹화된 집계 + 전체 기준의 그룹화된 집계를 생성하게 됩니다.
-- ROLLUP 사용 예시1
SELECT EMP_NO, PAYMENT_MONTH, SUM(SAL)
FROM SALARIES
GROUP BY ROLLUP(EMP_NO, PAYMENT_MONTH);
'급여 지급 내역 테이블(SALARIES)'에서 사원번호(EMP_NO)와 지급년월(PAYMENT_MONTH) 기준으로 ROLLUP 기능을 사용하였을 때, 아래 그룹화된 데이터를 출력하게 됩니다.
1. 사원번호를 기준으로 그룹화된 집계
2. 사원번호 + 지급년월을 기준으로 그룹화된 집계
3. 전체 집계
-- ROLLUP 사용 예시2
SELECT EMP_NO, PAYMENT_MONTH, SUM(SAL)
FROM SALARIES
GROUP BY ROLLUP((EMP_NO, PAYMENT_MONTH));
만약 '1. 사원번호를 기준으로 그룹화된 집계'를 제외하고 2번과 3번 집계 내역만 조회하고 싶을 경우 다음과 같이 (EMP_NO, PAYMENT_MONTH)를 괄호로 묶어 사용할 수도 있습니다.
추가로 'ROLLUP'의 경우 점진적 집계를 수행하기 때문에 지정된 컬럼의 순서를 바꾸게 되면 결과도 바뀌게 된다는 특징이 있습니다.
CUBE 내용 및 예시
GROUP BY CUBE(A, B);
-- A, B, A+B, () 기준 그룹화된 집계 생성 / (): 전체를 의미
'CUBE'의 경우 지정된 컬럼들의 모든 가능한 조합에 대한 집계 및 총 집계를 수행합니다.
때문에 특히 다차원 데이터 분석에서 유용하게 사용되는데요.
위의 'CUBE(A, B)' 쿼리를 기준으로 설명하자면, 'A' 기준의 그룹화된 집계 + 'B' 기준의 그룹화된 집계 + 'A, B' 기준의 그룹화된 집계 + 전체 기준의 그룹화된 집계 데이터를 생성하게 됩니다.
-- CUBE 사용 예시
SELECT EMP_NO, PAYMENT_MONTH, SUM(SAL)
FROM SALARIES
GROUP BY CUBE(EMP_NO, PAYMENT_MONTH);
'급여 지급 내역 테이블(SALARIES)'에서 사원번호(EMP_NO)와 지급년월(PAYMENT_MONTH) 기준으로 CUBE 기능을 사용하였을 때, 아래 그룹화된 데이터를 출력하게 됩니다.
1. 전체 집계
2. 지급년월 기준으로 그룹화된 집계
3. 사원번호를 기준으로 그룹화된 집계
4. 사원번호 + 지급년월을 기준으로 그룹화된 집계
추가로 'CUBE'의 경우 지정된 컬럼들의 모든 가능한 조합에 대한 집계를 수행하기 때문에 지정된 컬럼의 순서를 바꾸어도 결과에 영향을 받지 않는다는 특징이 있습니다.
'Programming > Database' 카테고리의 다른 글
동일한 테이블을 여러 번 조인하는 방법과 서브쿼리를 사용하는 방법의 차이 (1) | 2024.10.09 |
---|---|
ROW_NUMBER OVER PARTITION BY 그룹 내 순위를 반환하는 함수 (0) | 2024.07.21 |
테이블 백업이나 분석에 사용되는 CTAS (CREATE TABLE AS SELECT) 쿼리 (0) | 2024.05.23 |
SQL SELECT 쿼리 실행 순서 및 처리 과정 정리 (0) | 2024.05.09 |
MySQL CTE란? (+ WITH RECURSIVE CTE) (0) | 2024.01.27 |