Data Analysis 데이터 분석/SQL 통한 Database 관리

roll up, cube, grouping sets언제 뭐써야 하는지 어떻게 알까

Queen Julia 2024. 8. 19. 00:16

`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      |
|