`ROLLUP`, `CUBE`, 그리고 `GROUPING SETS`는 SQL에서 다양한 차원의 데이터를 집계하는 데 사용되는 기능입니다. 이 세 가지 기능은 비슷한 작업을 하지만, 다르게 작동하여 서로 다른 집계 수준을 제공합니다. 각각의 기능을 이해하기 위해 간단한 데이터셋을 사용해 설명하겠습니다.
### 예제 데이터셋
아래와 같은 `sales` 테이블이 있다고 가정하겠습니다.
| Region | Product | Year | Sales |
|---------|---------|------|-------|
| North | A | 2023 | 100 |
| North | B | 2023 | 150 |
| South | A | 2023 | 200 |
| South | B | 2023 | 250 |
| North | A | 2024 | 120 |
| North | B | 2024 | 180 |
| South | A | 2024 | 210 |
| South | B | 2024 | 260 |
### 1. `ROLLUP`
`ROLLUP`은 계층적으로 집계를 수행합니다. 예를 들어, `Region`, `Product`, 그리고 `Year`의 순서로 `ROLLUP`을 사용하면, 다음과 같은 집계 레벨이 생성됩니다:
```sql
SELECT Region, Product, Year, SUM(Sales) as TotalSales
FROM sales
GROUP BY ROLLUP(Region, Product, Year);
```
이 쿼리의 결과는 다음과 같습니다:
| Region | Product | Year | TotalSales |
|--------|---------|------|------------|
| North | A | 2023 | 100 |
| North | A | 2024 | 120 |
| North | A | NULL | 220 |
| North | B | 2023 | 150 |
| North | B | 2024 | 180 |
| North | B | NULL | 330 |
| North | NULL | NULL | 550 |
| South | A | 2023 | 200 |
| South | A | 2024 | 210 |
| South | A | NULL | 410 |
| South | B | 2023 | 250 |
| South | B | 2024 | 260 |
| South | B | NULL | 510 |
| South | NULL | NULL | 920 |
| NULL | NULL | NULL | 1470 |
여기서 `ROLLUP`은 다음의 단계로 집계를 수행합니다:
- `Region`, `Product`, `Year`에 대해 개별 집계
- `Product`, `Year`를 무시하고 `Region`에 대해 집계
- `Year`를 무시하고 `Region`, `Product`에 대해 집계
- 모든 것을 무시하고 전체 데이터를 집계
### 2. `CUBE`
`CUBE`는 가능한 모든 집계 조합을 계산합니다. 따라서 `Region`, `Product`, `Year`의 조합으로 `CUBE`를 사용하면, 모든 조합에 대해 집계된 결과를 제공합니다:
```sql
SELECT Region, Product, Year, SUM(Sales) as TotalSales
FROM sales
GROUP BY CUBE(Region, Product, Year);
```
이 쿼리의 결과는 다음과 같습니다:
| Region | Product | Year | TotalSales |
|--------|---------|------|------------|
| North | A | 2023 | 100 |
| North | A | 2024 | 120 |
| North | A | NULL | 220 |
| North | B | 2023 | 150 |
| North | B | 2024 | 180 |
| North | B | NULL | 330 |
| North | NULL | 2023 | 250 |
| North | NULL | 2024 | 300 |
| North | NULL | NULL | 550 |
| South | A | 2023 | 200 |
| South | A | 2024 | 210 |
| South | A | NULL | 410 |
| South | B | 2023 | 250 |
| South | B | 2024 | 260 |
| South | B | NULL | 510 |
| South | NULL | 2023 | 450 |
| South | NULL | 2024 | 470 |
| South | NULL | NULL | 920 |
| NULL | A | 2023 | 300 |
| NULL | A | 2024 | 330 |
| NULL | A | NULL | 630 |
| NULL | B | 2023 | 400 |
| NULL | B | 2024 | 440 |
| NULL | B | NULL | 840 |
| NULL | NULL | 2023 | 700 |
| NULL | NULL | 2024 | 770 |
| NULL | NULL | NULL | 1470 |
`CUBE`는 `ROLLUP`보다 더 많은 조합을 포함합니다. 모든 열에 대해 NULL을 사용할 수 있는 모든 가능한 조합에 대해 집계된 값을 반환합니다.
### 3. `GROUPING SETS`
`GROUPING SETS`는 여러 `GROUP BY` 절을 한 번에 명시적으로 지정할 수 있습니다. `GROUPING SETS`는 `ROLLUP`이나 `CUBE`보다 더 세밀하게 원하는 그룹화 조합만 지정할 수 있는 유연성을 제공합니다.
예를 들어, 특정 조합만 집계하려는 경우:
```sql
SELECT Region, Product, Year, SUM(Sales) as TotalSales
FROM sales
GROUP BY GROUPING SETS (
(Region, Product, Year),
(Region, Product),
(Region),
()
);
```
이 쿼리의 결과는 다음과 같습니다:
| Region | Product | Year | TotalSales |
|--------|---------|------|------------|
| North | A | 2023 | 100 |
| North | A | 2024 | 120 |
| North | B | 2023 | 150 |
| North | B | 2024 | 180 |
| South | A | 2023 | 200 |
| South | A | 2024 | 210 |
| South | B | 2023 | 250 |
| South | B | 2024 | 260 |
| North | A | NULL | 220 |
| North | B | NULL | 330 |
| South | A | NULL | 410 |
| South | B | NULL | 510 |
| North | NULL | NULL | 550 |
| South | NULL | NULL | 920 |
| NULL | NULL | NULL | 1470 |
여기서는 `GROUPING SETS`가 명시된 조합들에 대해서만 집계를 수행합니다.
### 요약
- **`ROLLUP`**: 계층적인 집계를 수행하며, 일반적으로 각 차원에 대해 집계를 쌓아가면서 부분 합계를 제공합니다.
- **`CUBE`**: 모든 가능한 차원 조합에 대해 집계를 수행합니다.
- **`GROUPING SETS`**: 특정 그룹화 조합에 대해 명시적으로 집계를 수행할 수 있습니다. `ROLLUP`이나 `CUBE`보다 더 유연하고 제어된 집계를 원할 때 사용합니다.
각각의 기능은 데이터를 다양한 방식으로 집계하여, 분석의 필요에 따라 적절한 기능을 선택하여 사용할 수 있습니다.