`ROLLUP`, `CUBE`, `GROUPING SETS`는 SQL에서 다차원 분석 및 집계를 수행할 때 사용하는 강력한 도구들입니다. 각 기능은 다른 방식으로 집계 결과를 생성하며, 특정 분석 요구에 따라 선택할 수 있습니다. 언제 어떤 기능을 써야 하는지 이해하기 위해서는 각 기능의 작동 방식과 특징을 알아야 합니다.
### 1. `ROLLUP`
**용도:** 계층적인 집계가 필요할 때 사용합니다.
**설명:** `ROLLUP`은 `GROUP BY` 절에서 사용하는 집계 옵션으로, 지정한 열들의 계층 구조에 따라 소계와 총계를 자동으로 생성합니다. 최종적으로는 전체 합계까지 제공합니다. 주로, 상위 그룹으로의 집계(예: 분기별 집계에서 연간 집계)와 같은 시나리오에 유용합니다.
**언제 사용해야 할까?**
- **계층 구조**가 있는 데이터에서 상위 수준까지의 집계가 필요할 때.
- **단일 차원**의 집계를 원할 때. 예를 들어, 연도별, 지역별로 데이터를 집계하고 각 연도별로 총계를 원할 때.
**예시:**
```sql
SELECT region, product, SUM(sales_amount)
FROM sales
GROUP BY ROLLUP(region, product);
```
### 2. `CUBE`
**용도:** 모든 가능한 조합에 대한 집계가 필요할 때 사용합니다.
**설명:** `CUBE`는 `GROUP BY` 절에서 사용하는 집계 옵션으로, 지정한 모든 열의 가능한 모든 조합에 대해 집계를 생성합니다. 이 기능은 다차원 분석에서 모든 차원(예: 지역, 제품)의 조합별 집계와 전체 합계를 제공합니다.
**언제 사용해야 할까?**
- **다차원 집계**가 필요한 경우.
- **모든 조합의 집계**가 필요할 때. 예를 들어, 지역별, 제품별, 그리고 그 조합에 따른 모든 집계가 필요할 때.
**예시:**
```sql
SELECT region, product, SUM(sales_amount)
FROM sales
GROUP BY CUBE(region, product);
```
### 3. `GROUPING SETS`
**용도:** 특정 집합에 대한 선택적인 집계가 필요할 때 사용합니다.
**설명:** `GROUPING SETS`는 지정한 그룹의 조합들만 집계하도록 할 수 있는 기능입니다. 다른 두 옵션인 `ROLLUP`과 `CUBE`에 비해 유연성이 높아, 필요한 조합만 정확하게 집계할 수 있습니다.
**언제 사용해야 할까?**
- **특정 조합**만 집계하고 싶을 때.
- **더 유연한 집계**가 필요할 때, 예를 들어 모든 조합을 원하지 않고, 특정 집계 조합만 필요할 때.
**예시:**
```sql
SELECT region, product, SUM(sales_amount)
FROM sales
GROUP BY GROUPING SETS((region, product), (region), ());
```
### 결정 기준 요약
- **`ROLLUP`**을 사용해야 하는 경우:
- 계층 구조가 있는 데이터에서 각 계층의 소계와 총계를 보고 싶을 때.
- 한 차원에서 점진적인 집계를 하고자 할 때.
- **`CUBE`**를 사용해야 하는 경우:
- 다차원 데이터에서 모든 가능한 조합에 대한 집계를 원할 때.
- 복잡한 분석 보고서가 필요할 때, 예를 들어 다차원적인 요약 정보를 포함할 때.
- **`GROUPING SETS`**를 사용해야 하는 경우:
- 특정 집합에 대한 집계를 원할 때.
- `ROLLUP`이나 `CUBE`보다 더 세밀하게 집계할 조합을 지정하고 싶을 때.
### 예시 비교
아래 예시로 각 기능이 어떻게 다른 결과를 만드는지 살펴보겠습니다:
#### 데이터셋:
| 지역 | 제품 | 판매금액 |
|--------|--------|----------|
| 동부 | A | 100 |
| 동부 | B | 150 |
| 서부 | A | 200 |
| 서부 | B | 250 |
#### ROLLUP 예시:
```sql
SELECT region, product, SUM(sales_amount)
FROM sales
GROUP BY ROLLUP(region, product);
```
**결과:**
| 지역 | 제품 | 총판매액 |
|--------|--------|----------|
| 동부 | A | 100 |
| 동부 | B | 150 |
| 동부 | NULL | 250 |
| 서부 | A | 200 |
| 서부 | B | 250 |
| 서부 | NULL | 450 |
| NULL | NULL | 700 |
#### CUBE 예시:
```sql
SELECT region, product, SUM(sales_amount)
FROM sales
GROUP BY CUBE(region, product);
```
**결과:**
| 지역 | 제품 | 총판매액 |
|--------|--------|----------|
| 동부 | A | 100 |
| 동부 | B | 150 |
| 동부 | NULL | 250 |
| 서부 | A | 200 |
| 서부 | B | 250 |
| 서부 | NULL | 450 |
| NULL | A | 300 |
| NULL | B | 400 |
| NULL | NULL | 700 |
#### GROUPING SETS 예시:
```sql
SELECT region, product, SUM(sales_amount)
FROM sales
GROUP BY GROUPING SETS((region, product), (region), ());
```
**결과:**
| 지역 | 제품 | 총판매액 |
|--------|--------|----------|
| 동부 | A | 100 |
| 동부 | B | 150 |
| 동부 | NULL | 250 |
| 서부 | A | 200 |
| 서부 | B | 250 |
|
'Data Analysis 데이터 분석 > SQL 통한 Database 관리' 카테고리의 다른 글
order by 연봉 desc 할때, 연봉값은 같고 사원id 가 다른 두개 있을때 누가 먼저 (0) | 2024.08.19 |
---|---|
roll up 함수 (0) | 2024.08.19 |
groupung sets 예시에 대해 알려줘 (0) | 2024.08.19 |
cube() 인자 쓰는법 (0) | 2024.08.18 |
roll up 인자 안에 괄호 있는 경우, 없는경우 예시로 보여줘 (0) | 2024.08.18 |