`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()`**: 특정 순서로 그룹화하여 자동으로 부분합을 계산합니다.
이 기능들을 사용하면 데이터 집계 시 다양한 각도에서 데이터를 분석할 수 있으며, 효율적으로 다차원 집계 데이터를 생성할 수 있습니다.
'Data Analysis 데이터 분석 > 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 |