SQL 통한 Database 관리

grouping sets () rollup()

JBS 12 2024. 8. 19. 00:19

`GROUPING SETS()`와 `ROLLUP()`은 SQL에서 집계 결과를 더 유연하고 세밀하게 생성할 수 있도록 도와주는 기능입니다. 둘 다 `GROUP BY` 절과 함께 사용되며, 다차원적인 집계 데이터를 생성하는 데 사용됩니다. 여기서 각각의 기능을 설명하고 예시를 통해 이해를 돕겠습니다.

### 1. `GROUPING SETS()`

`GROUPING SETS()`는 다양한 그룹화 조합을 명시적으로 지정하여 각각의 집계 결과를 별도로 생성할 수 있게 합니다. 즉, 그룹화 기준을 사용자 정의할 수 있는 방법입니다.

#### 예제

```sql
SELECT department, region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY GROUPING SETS (
    (department, region),
    (department),
    (region),
    ()
);
```

#### 결과

이 쿼리는 `sales_data` 테이블에서 `department`와 `region`을 기반으로 집계를 수행하며, 다음과 같은 그룹화 조합에 대해 결과를 생성합니다:

1. **(department, region)**: 부서별, 지역별 집계.
2. **(department)**: 부서별 전체 집계.
3. **(region)**: 지역별 전체 집계.
4. **()**: 모든 데이터에 대한 전체 집계(전체 합계).

| department | region | total_sales |
|------------|--------|-------------|
| Sales      | East   | 1000        |
| Sales      | West   | 800         |
| Sales      | NULL   | 1800        |
| HR         | East   | 600         |
| HR         | West   | 400         |
| HR         | NULL   | 1000        |
| NULL       | East   | 1600        |
| NULL       | West   | 1200        |
| NULL       | NULL   | 2800        |

### 2. `ROLLUP()`

`ROLLUP()`은 특정 순서에 따라 자동으로 단계별 집계 결과를 생성합니다. 이는 특정 열의 부분합을 단계적으로 계산하는 데 유용합니다.

#### 예제

```sql
SELECT department, region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY ROLLUP(department, region);
```

#### 결과

이 쿼리는 `sales_data` 테이블에서 `ROLLUP(department, region)`을 사용하여 다음과 같은 집계 결과를 생성합니다:

1. **(department, region)**: 부서별, 지역별 집계.
2. **(department)**: 부서별 전체 집계.
3. **()**: 모든 데이터에 대한 전체 집계.

이 경우 `ROLLUP()`은 계층적으로 집계를 수행하며, 모든 가능한 부분합을 자동으로 생성합니다. 결과는 다음과 같습니다:

| department | region | total_sales |
|------------|--------|-------------|
| Sales      | East   | 1000        |
| Sales      | West   | 800         |
| Sales      | NULL   | 1800        |
| HR         | East   | 600         |
| HR         | West   | 400         |
| HR         | NULL   | 1000        |
| NULL       | NULL   | 2800        |

#### 동작 방식

- `ROLLUP(department, region)`:
  - `department`와 `region`을 기준으로 먼저 그룹화.
  - 다음으로 `department`만을 기준으로 그룹화.
  - 마지막으로 전체 데이터를 그룹화.

### 3. `ROLLUP()`과 `GROUPING SETS()` 비교

- **`GROUPING SETS()`**: 여러 그룹화 기준을 사용자 정의하여 명시적으로 지정할 수 있습니다. `GROUPING SETS`는 그룹화의 순서를 엄격하게 정의할 수 있는 유연한 방법입니다.
  
- **`ROLLUP()`**: 특정 순서에 따라 자동으로 부분합을 계산합니다. 계층적 집계가 필요할 때 사용됩니다. `ROLLUP`은 일반적으로 더 간결한 문법으로 사용되며, 일련의 부분합을 생성하는 데 적합합니다.

### 요약

- **`GROUPING SETS()`**: 집계하려는 그룹화 조합을 명시적으로 지정합니다.
- **`ROLLUP()`**: 특정 순서로 그룹화하여 자동으로 부분합을 계산합니다.

이 기능들을 사용하면 데이터 집계 시 다양한 각도에서 데이터를 분석할 수 있으며, 효율적으로 다차원 집계 데이터를 생성할 수 있습니다.

'SQL 통한 Database 관리' 카테고리의 다른 글

cube()  (0) 2024.08.20
start with, connect by prior c, order siblings by  (0) 2024.08.20
partition by  (0) 2024.08.19
connect by prior의 부모 자식 아는 법  (0) 2024.08.19
join, cross join, natural join  (0) 2024.08.19