`ROLLUP`, `CUBE`, 그리고 `GROUPING SETS`는 SQL에서 다양한 차원의 데이터를 집계하는 데 사용되는 기능입니다. 이 세 가지 기능은 비슷한 작업을 하지만, 다르게 작동하여 서로 다른 집계 수준을 제공합니다. 각각의 기능을 이해하기 위해 간단한 데이터셋을 사용해 설명하겠습니다. ### 예제 데이터셋 아래와 같은 `sales` 테이블이 있다고 가정하겠습니다. | Region | Product | Year | Sales | |---------|---------|------|-------| | North | A | 2023 | 100 | | North | B | 2023 | 150 | | South | A | 2023 | 200 | | South | B | 2023 | 250 | | North | A | 2024 | 120 | | North | B | 2024 | 180 | | South | A | 2024 | 210 | | South | B | 2024 | 260 | ### 1. `ROLLUP` `ROLLUP`은 계층적으로 집계를 수행합니다. 예를 들어, `Region`, `Product`, 그리고 `Year`의 순서로 `ROLLUP`을 사용하면, 다음과 같은 집계 레벨이 생성됩니다: ```sql SELECT Region, Product, Year, SUM(Sales) as TotalSales FROM sales GROUP BY ROLLUP(Region, Product, Year); ``` 이 쿼리의 결과는 다음과 같습니다: | Region | Product | Year | TotalSales | |--------|---------|------|------------| | North | A | 2023 | 100 | | North | A | 2024 | 120 | | North | A | NULL | 220 | | North | B | 2023 | 150 | | North | B | 2024 | 180 | | North | B | NULL | 330 | | North | NULL | NULL | 550 | | South | A | 2023 | 200 | | South | A | 2024 | 210 | | South | A | NULL | 410 | | South | B | 2023 | 250 | | South | B | 2024 | 260 | | South | B | NULL | 510 | | South | NULL | NULL | 920 | | NULL | NULL | NULL | 1470 | 여기서 `ROLLUP`은 다음의 단계로 집계를 수행합니다: - `Region`, `Product`, `Year`에 대해 개별 집계 - `Product`, `Year`를 무시하고 `Region`에 대해 집계 - `Year`를 무시하고 `Region`, `Product`에 대해 집계 - 모든 것을 무시하고 전체 데이터를 집계 ### 2. `CUBE` `CUBE`는 가능한 모든 집계 조합을 계산합니다. 따라서 `Region`, `Product`, `Year`의 조합으로 `CUBE`를 사용하면, 모든 조합에 대해 집계된 결과를 제공합니다: ```sql SELECT Region, Product, Year, SUM(Sales) as TotalSales FROM sales GROUP BY CUBE(Region, Product, Year); ``` 이 쿼리의 결과는 다음과 같습니다: | Region | Product | Year | TotalSales | |--------|---------|------|------------| | North | A | 2023 | 100 | | North | A | 2024 | 120 | | North | A | NULL | 220 | | North | B | 2023 | 150 | | North | B | 2024 | 180 | | North | B | NULL | 330 | | North | NULL | 2023 | 250 | | North | NULL | 2024 | 300 | | North | NULL | NULL | 550 | | South | A | 2023 | 200 | | South | A | 2024 | 210 | | South | A | NULL | 410 | | South | B | 2023 | 250 | | South | B | 2024 | 260 | | South | B | NULL | 510 | | South | NULL | 2023 | 450 | | South | NULL | 2024 | 470 | | South | NULL | NULL | 920 | | NULL | A | 2023 | 300 | | NULL | A | 2024 | 330 | | NULL | A | NULL | 630 | | NULL | B | 2023 | 400 | | NULL | B | 2024 | 440 | | NULL | B | NULL | 840 | | NULL | NULL | 2023 | 700 | | NULL | NULL | 2024 | 770 | | NULL | NULL | NULL | 1470 | `CUBE`는 `ROLLUP`보다 더 많은 조합을 포함합니다. 모든 열에 대해 NULL을 사용할 수 있는 모든 가능한 조합에 대해 집계된 값을 반환합니다. ### 3. `GROUPING SETS` `GROUPING SETS`는 여러 `GROUP BY` 절을 한 번에 명시적으로 지정할 수 있습니다. `GROUPING SETS`는 `ROLLUP`이나 `CUBE`보다 더 세밀하게 원하는 그룹화 조합만 지정할 수 있는 유연성을 제공합니다. 예를 들어, 특정 조합만 집계하려는 경우: ```sql SELECT Region, Product, Year, SUM(Sales) as TotalSales FROM sales GROUP BY GROUPING SETS ( (Region, Product, Year), (Region, Product), (Region), () ); ``` 이 쿼리의 결과는 다음과 같습니다: | Region | Product | Year | TotalSales | |--------|---------|------|------------| | North | A | 2023 | 100 | | North | A | 2024 | 120 | | North | B | 2023 | 150 | | North | B | 2024 | 180 | | South | A | 2023 | 200 | | South | A | 2024 | 210 | | South | B | 2023 | 250 | | South | B | 2024 | 260 | | North | A | NULL | 220 | | North | B | NULL | 330 | | South | A | NULL | 410 | | South | B | NULL | 510 | | North | NULL | NULL | 550 | | South | NULL | NULL | 920 | | NULL | NULL | NULL | 1470 | 여기서는 `GROUPING SETS`가 명시된 조합들에 대해서만 집계를 수행합니다. ### 요약 - **`ROLLUP`**: 계층적인 집계를 수행하며, 일반적으로 각 차원에 대해 집계를 쌓아가면서 부분 합계를 제공합니다. - **`CUBE`**: 모든 가능한 차원 조합에 대해 집계를 수행합니다. - **`GROUPING SETS`**: 특정 그룹화 조합에 대해 명시적으로 집계를 수행할 수 있습니다. `ROLLUP`이나 `CUBE`보다 더 유연하고 제어된 집계를 원할 때 사용합니다. 각각의 기능은 데이터를 다양한 방식으로 집계하여, 분석의 필요에 따라 적절한 기능을 선택하여 사용할 수 있습니다.