ROLLUP·CUBE·GROUPING SETS
쉽게 말하면
ROLLUP, CUBE, GROUPING SETS는 소계와 합계를 한 번에 뽑아 주는 도구예요. 지점별, 상품별 매출을 낼 때 지점마다 소계와 전체 합계까지 한 표에 붙여 줘요. ROLLUP은 위계대로 소계, CUBE는 가능한 모든 조합, GROUPING SETS는 적은 기준마다 따로 집계해요.
시험용 정의
그룹 함수(ROLLUP, CUBE, GROUPING SETS)는 GROUP BY에서 소계와 합계를 한 번에 만든다. ROLLUP(a, b): (a, b), (a), () 계층 소계. CUBE(a, b): (a, b), (a), (b), () 가능한 모든 조합. GROUPING SETS(a, b): 적은 그룹만 각각(a별, b별) 집계하고 합계는 없다. 소계 행에서 집계에 쓰이지 않은 열은 NULL로 나오고, GROUPING(열)은 그런 행에서 1을 돌려준다.
비유로 이해하기
매장 매출 보고서다. ROLLUP은 '지점-상품별 → 지점별 소계 → 전사 합계' 순서의 보고서, CUBE는 지점별·상품별·지점×상품·전체를 모두 낸 교차 집계표, GROUPING SETS는 '지점별 표 하나, 상품별 표 하나'만 따로 붙인 것이다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 소계 | 중간 단계 합계. 부서별 합계처럼 일부 열로만 묶은 집계 |
| 총계(합계) | 전체를 한 그룹으로 본 집계. 그룹 기준이 빈 () 이다 |
| GROUPING(열) | 그 행이 열을 묶지 않은 소계·합계 행이면 1, 아니면 0 |
| UNION ALL | 두 결과를 그대로 이어 붙이는 집합 연산. 그룹 함수는 여러 GROUP BY 결과를 UNION ALL한 것과 같다 |
세 함수 비교 (열 a, b)
| 함수 | 만드는 그룹 | 그룹 수 |
|---|---|---|
| ROLLUP(a, b) | (a, b), (a), () | n + 1 = 3단계 |
| CUBE(a, b) | (a, b), (a), (b), () | 2ⁿ = 4단계 |
| GROUPING SETS(a, b) | (a), (b) | 적은 것만. 합계를 원하면 ()를 넣는다 |
| GROUPING SETS((a, b), a, ()) | (a, b), (a), () | ROLLUP(a, b)와 같다 |
알아 둘 점
- ROLLUP은 열 순서가 중요하다. ROLLUP(a, b)와 ROLLUP(b, a)는 결과가 다르다. CUBE와 GROUPING SETS는 순서가 바뀌어도 만드는 그룹은 같다
- 소계 행에서는 묶지 않은 열이 NULL이다. 원래 데이터에 NULL이 있으면 헷갈리므로
GROUPING(열)로 구별한다 - 보기 좋게 하려면
CASE WHEN GROUPING(job) = 1 THEN '소계' ELSE job END처럼 바꿔 쓴다 - ROLLUP(a, (b, c))처럼 괄호로 묶으면 b, c가 한 덩어리로 취급된다
시험에 이렇게 나와요
- ROLLUP·CUBE·GROUPING SETS가 만드는 그룹과 결과 행 수
- ROLLUP은 열 순서에 따라 결과가 달라짐, CUBE는 2ⁿ 조합
- GROUPING SETS 결과와 같은 ROLLUP·UNION ALL 쿼리 고르기
- GROUPING 함수 값과 CASE로 '소계' 표시
- 결과 표를 보고 어떤 GROUP BY를 썼는지 고르기
출제 범위·공식 안내 기반
확인 문제
Q1. GROUP BY ROLLUP(deptno, job)이 만드는 집계 단계는?
- (deptno, job), (deptno), (job), 전체
- (deptno, job)만
- (deptno), (job)
- (deptno, job), (deptno), 전체
정답 보기
4번 (deptno, job), (deptno), 전체
ROLLUP은 오른쪽 열부터 하나씩 빼며 계층적 소계를 만든다. (deptno, job) → (deptno) 소계 → 전체 합계. 모든 조합을 만드는 것은 CUBE다.
Q2. 부서 3개, 직무 4개가 모든 조합으로 있을 때 GROUP BY CUBE(부서, 직무)의 결과 행 수는?
- 12
- 16
- 19
- 20
정답 보기
4번 20
상세 3×4 = 12 + 부서별 3 + 직무별 4 + 합계 1 = 20.
Q3. GROUP BY ROLLUP(a, b)와 같은 결과를 내는 것은?
- GROUPING SETS((a, b), a, ())
- GROUPING SETS(a, b)
- CUBE(a, b)
- GROUPING SETS((a, b), b, ())
정답 보기
1번 GROUPING SETS((a, b), a, ())
ROLLUP(a, b) = (a, b), (a), ().
Q4. 결과가 '부서별 합계 행들 + 직무별 합계 행들'로만 이루어졌다. 어떤 GROUP BY인가?
- ROLLUP(deptno, job)
- CUBE(deptno, job)
- GROUP BY deptno, job
- GROUPING SETS(deptno, job)
정답 보기
4번 GROUPING SETS(deptno, job)
상세·합계 없이 각각만 낸 GROUPING SETS.
Q5. GROUP BY ROLLUP(deptno)의 결과로 옳은 것은?
- 부서별 합계만
- 전체 합계만
- 부서별 합계 + 전체 합계 1행
- 가능한 모든 조합의 합계
정답 보기
3번 부서별 합계 + 전체 합계 1행
ROLLUP(a)는 (a)와 전체 합계를 만든다.
Q6. ROLLUP이 만든 전체 합계 행에서 GROUPING(deptno)의 값은?
- NULL
- 0
- 부서 수
- 1
정답 보기
4번 1
그 열이 소계로 묶인 행이면 1, 아니면 0이다.
헷갈리기 쉬운 O·X
ROLLUP(a, b)와 ROLLUP(b, a)의 결과는 같다.
정답 보기
X ROLLUP은 오른쪽부터 빼며 소계를 만들어 순서가 중요하다.
CUBE는 인수로 준 열의 가능한 모든 조합으로 소계를 만든다.
정답 보기
O 열 n개면 2ⁿ개의 그룹 단위.
GROUPING SETS(a, b)는 전체 합계 행을 자동으로 포함한다.
정답 보기
X 적은 그룹만 만든다. 합계를 원하면 ()를 넣는다.