`GROUPING SETS`는 SQL에서 특정한 집계 조합을 명시적으로 정의하여 집계 결과를 얻고자 할 때 사용하는 기능입니다. `ROLLUP`이나 `CUBE`와는 달리, `GROUPING SETS`는 집계할 열의 조합을 정확하게 지정할 수 있어, 불필요한 집계를 방지하고 성능을 최적화할 수 있습니다.
### `GROUPING SETS`의 작동 방식
`GROUPING SETS`는 `GROUP BY` 절에서 사용할 수 있으며, 집계하고자 하는 특정 그룹의 조합을 괄호 안에 나열합니다. 각 조합은 각각 별도의 집계 결과를 생성합니다.
### 구문
```sql
SELECT column1, column2, aggregate_function(column3)
FROM table
GROUP BY GROUPING SETS ((column1, column2), (column1), (column2), ());
```
위 구문에서:
- `(column1, column2)`는 `column1`과 `column2`의 조합에 대한 집계를 의미합니다.
- `(column1)`은 `column1`만을 기준으로 한 집계를 의미합니다.
- `(column2)`은 `column2`만을 기준으로 한 집계를 의미합니다.
- `()`는 전체 집계를 의미합니다.
### 예제
#### 예제 테이블
다음과 같은 `sales` 테이블이 있다고 가정합니다:
| region | product | sales_amount |
|--------|---------|--------------|
| East | A | 100 |
| East | B | 150 |
| West | A | 200 |
| West | B | 250 |
#### 예제 쿼리
```sql
SELECT region, product, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY GROUPING SETS (
(region, product), -- 각 지역별 제품별 집계
(region), -- 각 지역별 전체 집계
(product), -- 각 제품별 전체 집계
() -- 전체 집계
);
```
#### 결과
이 쿼리는 다음과 같은 결과를 생성합니다:
| region | product | total_sales |
|--------|---------|-------------|
| East | A | 100 | -- East 지역의 A 제품 판매 합계
| East | B | 150 | -- East 지역의 B 제품 판매 합계
| East | NULL | 250 | -- East 지역의 총 판매 합계
| West | A | 200 | -- West 지역의 A 제품 판매 합계
| West | B | 250 | -- West 지역의 B 제품 판매 합계
| West | NULL | 450 | -- West 지역의 총 판매 합계
| NULL | A | 300 | -- 모든 지역에서 A 제품 판매 합계
| NULL | B | 400 | -- 모든 지역에서 B 제품 판매 합계
| NULL | NULL | 700 | -- 전체 총 판매 합계
### 결과 해석
- **(region, product)**: 각 지역별, 제품별로 세분화된 집계.
- **(region)**: 각 지역별 총합 (제품 구분 없이).
- **(product)**: 각 제품별 총합 (지역 구분 없이).
- **()**: 모든 데이터를 합친 전체 합계.
### `GROUPING SETS`를 사용할 때 유용한 상황
- **선택적인 집계**가 필요할 때: 모든 가능한 조합을 집계할 필요가 없고, 특정 조합만 집계하고 싶을 때 유용합니다.
- **성능 최적화**: `ROLLUP`이나 `CUBE`는 모든 조합에 대해 집계를 수행하기 때문에, 불필요한 집계가 많아질 수 있습니다. `GROUPING SETS`는 필요한 집계만 수행하기 때문에 더 효율적입니다.
- **복잡한 보고서 생성**: 다차원 데이터 분석에서, 정확히 어떤 집계가 필요한지 알고 있을 때 사용하면 좋습니다.
### 예시 비교
- **`ROLLUP(region, product)`**는 `region`과 `product`의 모든 상위 집계 (즉, `region`별, `product`별, 전체) 결과를 생성합니다.
- **`CUBE(region, product)`**는 `region`과 `product`의 모든 조합에 대한 집계를 생성합니다.
- **`GROUPING SETS((region, product), (region), (product), ())`**는 사용자가 지정한 특정 조합에 대해서만 집계를 수행합니다.
이렇게 각 기능은 집계할 데이터의 수준과 범위를 달리하여 집계 결과를 생성하는데, `GROUPING SETS`는 필요에 따라 집계할 조합을 세밀하게 조정할 수 있어 매우 유용합니다.
'Data Analysis 데이터 분석 > SQL 통한 Database 관리' 카테고리의 다른 글
roll up 함수 (0) | 2024.08.19 |
---|---|
roll up, cube, grouping sets언제 뭐써야 하는지 어떻게 알까 (0) | 2024.08.19 |
cube() 인자 쓰는법 (0) | 2024.08.18 |
roll up 인자 안에 괄호 있는 경우, 없는경우 예시로 보여줘 (0) | 2024.08.18 |
rollup( (job),(deptno)) (0) | 2024.08.18 |