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

groupung sets 예시에 대해 알려줘

Queen Julia 2024. 8. 19. 00:15

`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`는 필요에 따라 집계할 조합을 세밀하게 조정할 수 있어 매우 유용합니다.