2025.02.16 - [자격증/SQLD] - [SQLD] 4-3: 집합 연산자 (Set Operators)
0. 집계 함수와 소계(총계) 함수 개념
1️⃣ 집계 함수 (Aggregate Functions)
- GROUP BY와 함께 사용하여 그룹별 데이터를 집계하는 함수.
- 데이터의 개수, 합계, 평균, 최대값, 최소값 등을 구할 때 사용.
- 대표적인 함수: COUNT, SUM, AVG, MAX, MIN 등.
2️⃣ 소계(총계) 함수 (Subtotal Functions)
- 그룹별로 중간 합계(소계) 및 전체 합계(총계)를 구하는 함수.
- 데이터 분석 시, 계층적인 그룹핑과 단계별 합계를 구하는 데 유용.
- 대표적인 함수: ROLLUP, CUBE, GROUPING SETS 등.
집계 함수 | 데이터를 그룹별로 집계 | COUNT, SUM, AVG, MAX, MIN |
소계(총계) 함수 | 소그룹 간 소계 및 총계 계산 | ROLLUP, CUBE, GROUPING SETS |
1. 집계 함수(Aggregate Functions)란?
집계 함수는 SQL에서 데이터를 요약하는 데 사용되는 함수로, 주어진 그룹 내에서 여러 값을 하나의 결과 값으로 변환하는 역할을 합니다. 주요 집계 함수는 다음과 같습니다.
SUM() | 특정 그룹의 값의 총합을 계산 |
AVG() | 특정 그룹의 평균 값을 계산 |
COUNT() | 특정 그룹 내 레코드 개수를 계산 |
MAX() | 특정 그룹에서 최대값을 반환 |
MIN() | 특정 그룹에서 최소값을 반환 |
1.2. 예제: SUM()을 활용한 그룹별 총합 계산
SELECT A, SUM(amount) AS total_amount
FROM sales
GROUP BY A;
이 SQL 문은 A 컬럼을 기준으로 그룹을 묶고, 각 그룹의 총 amount 값을 계산합니다.
결과:
A | total_amount |
A1 | 1000 |
A2 | 1500 |
집계 함수는 GROUP BY 절과 함께 사용되며, ROLLUP, CUBE, GROUPING SETS와 결합하여 더욱 강력한 분석이 가능합니다.
2. ROLLUP이란?
ROLLUP은 GROUP BY 절과 함께 사용되는 확장 기능으로, 계층적 그룹화(hierarchical grouping) 를 수행하여 그룹별 소계와 총합계를 자동으로 계산합니다. 즉, 여러 수준의 집계 결과를 한 번의 SQL 실행으로 얻을 수 있습니다.
ROLLUP을 사용하면 특정 컬럼을 기준으로 점진적인 그룹핑(Grouping) 이 이루어집니다. 예를 들어 ROLLUP(A, B, C)를 실행하면 다음과 같은 그룹이 자동 생성됩니다:
- (A, B, C) 그룹별 집계 (가장 상세한 집계)
- (A, B) 그룹별 소계
- (A) 그룹별 소계
- 전체 데이터의 총합계
즉, ROLLUP의 컬럼 순서에 따라 계층적으로 그룹화가 진행되며, 상위 수준의 집계가 자동으로 추가됩니다.
2.1. ROLLUP 사용법과 예제
ROLLUP을 사용할 때는 GROUP BY 절과 함께 사용하며, 일반적인 그룹화 연산과 마찬가지로 SUM(), COUNT(), AVG() 등의 집계 함수(Aggregate Function)를 활용할 수 있습니다.
1) ROLLUP(A): 단일 컬럼 그룹핑
A | B | C | amount |
A1 | B1 | C1 | 300 |
A1 | B1 | C2 | 200 |
A1 | B2 | C3 | 500 |
A2 | B3 | C4 | 1500 |
SELECT A, SUM(amount) AS total_amount
FROM sales
GROUP BY ROLLUP(A);
포함 내용:
✅ A 별 그룹별 합계 계산
✅ 전체 데이터의 총합계 포함
예제 결과
A | total_amount |
A1 | 1000 |
A2 | 1500 |
NULL | 2500 |
여기서 NULL 행은 전체 데이터의 총합계를 나타냅니다.
2) ROLLUP(A, B): 2개 컬럼 그룹핑
A | B | C | amout |
A1 | B1 | C1 | 300 |
A1 | B1 | C2 | 200 |
A1 | B2 | C3 | 500 |
A2 | B3 | C4 | 1500 |
SELECT A, B, SUM(amount) AS total_amount
FROM sales
GROUP BY ROLLUP(A, B);
포함 내용:
✅ A, B 그룹별 합계 계산
✅ A 기준으로 소계 계산
✅ 전체 데이터의 총합계 포함
예제 결과
A | B | total_amount |
A1 | B1 | 500 |
A1 | B2 | 500 |
A1 | NULL | 1000 |
A2 | B3 | 1500 |
A2 | NULL | 1500 |
NULL | NULL | 2500 |
이처럼 ROLLUP(A, B) 를 사용하면 B 그룹별 집계가 먼저 수행되고, 이후 A 기준으로 소계가 자동 생성됩니다.
ROLLUP(A, B, C): 3개 컬럼 그룹핑
A | B | C | amount |
A1 | B1 | C1 | 300 |
A1 | B1 | C2 | 200 |
A1 | B2 | C3 | 500 |
A2 | B3 | C4 | 1500 |
SELECT A, B, C, SUM(amount) AS total_amount
FROM sales
GROUP BY ROLLUP(A, B, C);
포함 내용:
✅ A, B, C 개별 그룹별 합계 계산
✅ A, B 기준 소계 계산
✅ A 기준 소계 계산
✅ 전체 데이터의 총합계 포함
예제 결과
A | B | C | total_amount |
A1 | B1 | C1 | 300 |
A1 | B1 | C2 | 200 |
A1 | B1 | NULL | 500 |
A1 | B2 | C3 | 500 |
A1 | B2 | NULL | 500 |
A1 | NULL | NULL | 1000 |
A2 | B3 | C4 | 1500 |
A2 | B3 | NULL | 1500 |
A2 | NULL | NULL | 1500 |
NULL | NULL | NULL | 2500 |
위 결과에서 NULL 값이 포함된 행은 상위 그룹의 소계 또는 총합계를 나타냅니다.
3. CUBE란?
CUBE 연산자는 ROLLUP과 유사하지만, 모든 가능한 그룹 조합에 대한 집계를 수행하는 것이 차이점입니다. 즉, 특정한 순서대로 소계를 계산하는 ROLLUP과 달리, CUBE는 가능한 모든 조합을 고려하여 소계를 자동 생성합니다.
예를 들어 CUBE(A, B, C)를 실행하면 다음과 같은 집계가 자동으로 생성됩니다:
- (A, B, C) 그룹별 집계
- (A, B) 그룹별 소계
- (A, C) 그룹별 소계
- (B, C) 그룹별 소계
- (A) 그룹별 소계
- (B) 그룹별 소계
- (C) 그룹별 소계
- 전체 데이터의 총합계
이처럼 CUBE는 ROLLUP보다 더욱 다양한 조합의 집계를 자동 생성합니다.
3.1 CUBE 사용법과 예제
CUBE는 GROUP BY 절과 함께 사용하며, SUM(), COUNT(), AVG() 등의 집계 함수와 조합할 수 있습니다.
1) CUBE(A): 단일 컬럼 그룹핑
A | B | C | amount |
A1 | B1 | C1 | 300 |
A1 | B1 | C2 | 200 |
A1 | B2 | C3 | 500 |
A2 | B3 | C4 | 1500 |
SELECT A, SUM(amount) AS total_amount
FROM sales
GROUP BY CUBE(A);
포함 내용:
✅ A 별 그룹별 합계 계산
✅ 전체 데이터의 총합계 포함
예제 결과
A | total_amount | |
A1 | 1000 | |
A2 | 1500 | |
NULL | 2500 | ← 총합계 |
2) CUBE(A, B): 2개 컬럼 그룹핑
A | B | C | amount |
A1 | B1 | C1 | 300 |
A1 | B1 | C2 | 200 |
A1 | B2 | C3 | 500 |
A2 | B3 | C4 | 1500 |
SELECT A, B, SUM(amount) AS total_amount
FROM sales
GROUP BY CUBE(A, B);
포함 내용:
✅ A, B 그룹별 합계 계산
✅ A 기준으로 소계 계산
✅ B 기준으로 소계 계산
✅ 전체 데이터의 총합계 포함
예제 결과
A | B | total_amount | |
A1 | B1 | 500 | |
A1 | B2 | 500 | |
A1 | NULL | 1000 | ← A1 소계 |
A2 | B3 | 1500 | |
A2 | NULL | 1500 | ← A2 소계 |
NULL | B1 | 500 | ← B1 소계 |
NULL | B2 | 500 | ← B2 소계 |
NULL | B3 | 1500 | ← B3 소계 |
NULL | NULL | 2500 | ← 총합계 |
3) CUBE(A, B, C): 3개 컬럼 그룹핑
A | B | C | amount |
A1 | B1 | C1 | 300 |
A1 | B1 | C2 | 200 |
A1 | B2 | C3 | 500 |
A2 | B3 | C4 | 1500 |
SELECT A, B, C, SUM(amount) AS total_amount
FROM sales
GROUP BY CUBE(A, B, C);
포함 내용:
✅ A, B, C 개별 그룹별 합계 계산
✅ A, B 기준 소계 계산
✅ A, C 기준 소계 계산
✅ B, C 기준 소계 계산
✅ A 기준 소계 계산
✅ B 기준 소계 계산
✅ C 기준 소계 계산
✅ 전체 데이터의 총합계 포함
예제 결과
A | B | C | total_amount |
A1 | B1 | C1 | 300 |
A1 | B1 | C2 | 200 |
A1 | B1 | NULL | 500 |
A1 | B2 | C3 | 500 |
A1 | B2 | NULL | 500 |
A1 | NULL | C1 | 300 |
A1 | NULL | C2 | 200 |
A1 | NULL | C3 | 500 |
A1 | NULL | NULL | 1000 |
NULL | NULL | NULL | 2500 |
4. GROUPING SETS란?
GROUPING SETS는 GROUP BY의 확장 기능 중 하나로, 사용자가 원하는 그룹화 방식을 유연하게 지정할 수 있습니다. ROLLUP과 CUBE는 특정 규칙에 따라 자동으로 그룹핑을 생성하는 반면, GROUPING SETS는 특정한 그룹 조합을 직접 명시적으로 지정할 수 있다는 점에서 차이가 있습니다.
- 원하는 그룹 조합을 직접 선택 가능
- 불필요한 그룹 조합을 제외할 수 있어 최적화된 결과 생성
- ROLLUP, CUBE와 함께 사용 가능
4.1 GROUPING SETS 사용법과 예제
1) GROUPING SETS(A, B): 두 개의 개별 그룹핑
A | B | C | amount |
A1 | B1 | C1 | 300 |
A1 | B1 | C2 | 200 |
A1 | B2 | C3 | 500 |
A2 | B3 | C4 | 1500 |
SELECT A, B, SUM(amount) AS total_amount
FROM sales
GROUP BY GROUPING SETS (A, B);
✅ A 기준으로 그룹화
✅ B 기준으로 그룹화
결과:
A | B | total_amount |
A1 | NULL | 1000 |
A2 | NULL | 1500 |
NULL | B1 | 1000 |
NULL | B2 | 500 |
NULL | B3 | 1500 |
2) GROUPING SETS(A, B, ()): 총합계 포함
A | B | C | amount |
A1 | B1 | C1 | 300 |
A1 | B1 | C2 | 200 |
A1 | B2 | C3 | 500 |
A2 | B3 | C4 | 1500 |
SELECT A, B, SUM(amount) AS total_amount
FROM sales
GROUP BY GROUPING SETS (A, B, ());
✅ A 기준으로 그룹화 ✅ B 기준으로 그룹화 ✅ 전체 총합계 추가
결과:
A | B | total_amount | |
A1 | NULL | 1000 | |
A2 | NULL | 1500 | |
NULL | B1 | 1000 | |
NULL | B2 | 500 | |
NULL | B3 | 1500 | |
NULL | NULL | 2500 | ← 총합계 |
3) GROUPING SETS(A, ROLLUP(B))
A | B | C | amount |
A1 | B1 | C1 | 300 |
A1 | B1 | C2 | 200 |
A1 | B2 | C3 | 500 |
A2 | B3 | C4 | 1500 |
SELECT A, B, SUM(amount) AS total_amount
FROM sales
GROUP BY GROUPING SETS (A, ROLLUP(B));
✅ A, B 그룹별 합계 계산
✅ B 기준 소계 계산
✅ 전체 데이터의 총합계 포함
결과:
A | B | total_amount | |
A1 | B1 | 500 | |
A1 | B2 | 500 | |
A1 | NULL | 1000 | ← A1 소계 |
A2 | B3 | 1500 | |
A2 | NULL | 1500 | ← A2 소계 |
NULL | NULL | 2500 | ← 총합계 |
4) GROUPING SETS(A, ROLLUP(B, C))
A | B | C | amount |
A1 | B1 | C1 | 300 |
A1 | B1 | C2 | 200 |
A1 | B2 | C3 | 500 |
A2 | B3 | C4 | 1500 |
SELECT A, B, C, SUM(amount) AS total_amount
FROM sales
GROUP BY GROUPING SETS (A, ROLLUP(B, C));
✅ A 기준 그룹별 합계 계산
✅ B, C 기준 그룹별 합계 계산
✅ B 기준 소계 계산
✅ C 기준 소계 계산
✅ 전체 데이터의 총합계 포함
결과:
A | B | C | total_amount | |
A1 | B1 | C1 | 300 | |
A1 | B1 | C2 | 200 | |
A1 | B1 | NULL | 500 | ← A1, B1 소계 |
A1 | B2 | C3 | 500 | |
A1 | B2 | NULL | 500 | ← A1, B2 소계 |
A1 | NULL | NULL | 1000 | ← A1 소계 |
A2 | B3 | C4 | 1500 | |
A2 | B3 | NULL | 1500 | ← A2, B3 소계 |
A2 | NULL | NULL | 1500 | ← A2 소계 |
NULL | NULL | NULL | 2500 | ← 총합계 |
5. ROLLUP, CUBE, GROUPING SETS 비교
연산자 | 그룹핑 방식 |
ROLLUP(A, B) | A → (A, B) 순서대로 소계 및 총합계를 생성 |
CUBE(A, B) | A, B 모든 조합의 소계를 생성 |
GROUPING SETS(A, B) | A와 B 각각 별도로 그룹핑 |
GROUPING SETS는 필요 없는 집계 수준을 제거하고, 원하는 그룹 조합만 선택할 수 있기 때문에 더 효율적으로 데이터 집계를 수행할 수 있습니다.
5. 마무리
GROUPING SETS는 SQL에서 그룹핑을 더욱 유연하게 수행할 수 있도록 도와주는 강력한 기능입니다. ROLLUP은 계층적인 그룹화, CUBE는 가능한 모든 조합의 그룹화, GROUPING SETS는 특정 그룹 조합만 선택하여 분석할 수 있는 차이점이 있습니다. 이를 적절히 활용하면 SQL 데이터를 더욱 효율적으로 분석할 수 있습니다.
이제 GROUPING SETS를 활용하여 원하는 방식으로 데이터를 그룹핑해 보세요! 🚀
💡 도움이 되셨다면 댓글과 공감 부탁드립니다! 😊
📌 더 많은 알고리즘 풀이와 프로그래밍 자료는 블로그에서 확인하세요!
✉️ 문의나 피드백은 댓글이나 이메일로 남겨주세요.
'자격증 > SQLD' 카테고리의 다른 글
[SQLD] 4-5: 윈도우 함수 (Window Functions) (0) | 2025.02.17 |
---|---|
[SQLD] 4-3: 집합 연산자 (Set Operators) (0) | 2025.02.17 |
[SQLD] 4-2: 뷰 (View) (0) | 2025.02.17 |
[SQLD] 4-1: 서브쿼리 (Subquery) (0) | 2025.02.17 |
Part 4: SQL 활용 (Advanced SQL Usage) (0) | 2025.02.16 |