SQL의 GROUPING SETS는 복잡한 집계 연산을 수행할 때 유용한 기능입니다. 이 기능을 사용하면 여러 집계 수준을 단일 쿼리에서 쉽게 계산할 수 있습니다. GROUPING SETS는 특히 다차원 데이터 분석에 유용하며, 보고서 생성이나 데이터 분석 시 깊이 있는 인사이트를 제공합니다. 이 포스팅에서는 GROUPING SETS의 기본 개념, 사용 방법, 그리고 실제 예시를 통해 이 기능의 활용법을 설명하겠습니다.
GROUPING SETS는 SQL 쿼리에서 여러 그룹화 집합을 동시에 지정할 수 있게 해주는 기능입니다. 이를 통해 여러 별도의 GROUP BY 쿼리를 합쳐서, 하나의 쿼리로 다양한 수준의 집계 결과를 얻을 수 있습니다. GROUPING SETS는 기본적으로 여러 GROUP BY 절의 조합을 나타내며, 이를 통해 데이터를 다양한 차원에서 분석할 수 있습니다.
GROUPING SETS를 사용하는 기본 구문은 다음과 같습니다.
SELECT column1, column2, AGG_FUNCTION(column3)
FROM table
GROUP BY GROUPING SETS (
(column1, column2),
(column1),
(column2),
()
);
이 구문에서 AGG_FUNCTION은 집계 함수(SUM, AVG, COUNT 등)를 나타내며, GROUPING SETS 내부에는 각각의 그룹화할 컬럼 세트를 괄호로 묶어 지정합니다. 빈 괄호 ()는 전체 집계(즉, 모든 행에 대한 집계)를 의미합니다.
상품 정보를 담은 PRODUCT 테이블과 오프라인 상품 판매 정보를 담은 OFFLINE_SALE 테이블을 가지고, 상품코드 별 매출액 합계를 구하는 상황을 가정해 봅시다. 이때 GROUPING SETS를 사용하여 상품코드 별, 그리고 전체 매출액을 동시에 조회하는 쿼리를 작성할 수 있습니다.
먼저, 각 테이블의 구조는 다음과 같습니다.
PRODUCT 테이블: PRODUCT_ID, PRODUCT_CODE, PRICEOFFLINE_SALE 테이블: OFFLINE_SALE_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE상품코드 별 매출액 합계를 구하는 쿼리는 다음과 같이 작성할 수 있습니다.
SELECT
p.PRODUCT_CODE,
SUM(p.PRICE * os.SALES_AMOUNT) AS SALES
FROM
PRODUCT p
JOIN
OFFLINE_SALE os ON p.PRODUCT_ID = os.PRODUCT_ID
GROUP BY
p.PRODUCT_CODE
ORDER BY
SALES DESC,
p.PRODUCT_CODE;
하지만, 여기서 GROUPING SETS를 사용하여 상품코드 별 매출액과 전체 매출액을 한 번에 조회하고자 한다면, 쿼리를 다음과 같이 확장할 수 있습니다.
SELECT
p.PRODUCT_CODE,
SUM(p.PRICE * os.SALES_AMOUNT) AS SALES
FROM
PRODUCT p
JOIN
OFFLINE_SALE os ON p.PRODUCT_ID = os.PRODUCT_ID
GROUP BY GROUPING SETS (
(p.PRODUCT_CODE),
()
)
ORDER BY
SALES DESC,
p.PRODUCT_CODE;
이 쿼리는
PRODUCT_CODE 별로 그룹화된 매출액과, 모든 상품에 대한 총 매출액(GROUP BY ()를 사용하여)을 계산합니다. 결과 집합에서 PRODUCT_CODE가 NULL인 행은 전체 매출액을 나타냅니다.
GROUPING SETS는 SQL에서 다차원 데이터 분석을 수행할 때 강력한 도구입니다. 복잡한 데이터 집합에 대해 다양한 수준의 집계를 단일 쿼리로 수행할 수 있게 해주며, 데이터 분석 과정을 효율적으로 만들어 줍니다. 이 포스팅을 통해 GROUPING SETS의 개념을 이해하고, 실제 데이터 분석 작업에 활용해 보시기 바랍니다.