GROUPING SETS 설명
원하는 그룹화만 정확히 선택합니다.
GROUPING SETS 설명은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
GROUPING SETS란 무엇입니까?
GROUP BY 절을 작성하면 그룹화할 열 집합 하나를 정의하게 됩니다. 하지만 때로는 질의를 여러 번 실행하고 UNION ALL을 사용하는 대신, 하나의 질의에서 서로 다른 여러 그룹화가 필요합니다.
GROUPING SETS를 사용하면 원하는 그룹화를 정확히 지정하고, 데이터를 한 번만 처리할 수 있습니다. 목록의 각 집합은 결과에 자체 집계 행을 생성합니다.
샘플 테이블: 매출
이 단원 전체에서 매출 테이블을 사용합니다. 이 테이블에는 지역, 상품 범주, 금액별 거래가 기록되어 있습니다.
코드를 실행하여 테이블을 생성하고 데이터를 입력하면 모든 예제를 따라 해 볼 수 있습니다.
CREATE TABLE sales (
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales VALUES
('East', 'Electronics', 500),
('East', 'Clothing', 200),
('West', 'Electronics', 300),
('West', 'Clothing', 400),
('North', 'Electronics', 150),
('North', 'Clothing', 250);기존 방식: UNION ALL
GROUPING SETS가 도입되기 전에는 여러 수준의 합계를 구하려면 별도의 질의를 작성한 다음 UNION ALL로 이어 붙여야 했습니다. 이 방식은 반복적이고 읽기 어려우며 테이블을 여러 번 스캔합니다.
아래 예제는 세 개의 별도 SELECT 문을 사용하여 지역별 합계 AND 범주별 합계를 반환합니다.
SELECT region, NULL AS category, SUM(amount) AS total
FROM sales
GROUP BY region
UNION ALL
SELECT NULL, category, SUM(amount)
FROM sales
GROUP BY category
UNION ALL
SELECT NULL, NULL, SUM(amount)
FROM sales;GROUPING SETS 구문
GROUPING SETS 절은 일반적인 GROUP BY 안에 배치하거나 이를 대신하여 사용할 수 있습니다. 원하는 각 그룹화를 괄호로 묶은 열 목록으로 나열합니다. 빈 집합 ()은 그룹화가 전혀 없는 총합계를 의미합니다.
이 하나의 질의는 앞의 세 부분으로 구성된 UNION ALL과 정확히 같은 작업을 수행하지만, 더 간결하고 테이블을 한 번만 스캔합니다.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region),
(category),
()
);결과 읽기
출력의 각 행은 정확히 하나의 그룹화 집합에 속합니다. 활성 그룹화 집합에 포함되지 않은 열의 값은 NULL입니다.
region = 'East'이고category = NULL인 행은(region)집합에 속합니다.region = NULL이고category = 'Electronics'인 행은(category)집합에 속합니다.- 두 값이 모두 NULL인 행은
()집합에서 나온 총합계입니다.
이러한 NULL은 구조적인 값입니다. 누락된 데이터가 아니라 해당 차원의 '모든 값'을 의미합니다.
다중 열 그룹화 집합
각 그룹화 집합에는 둘 이상의 열이 포함될 수 있습니다. (region, category) 집합은 일반적인 GROUP BY region, category와 마찬가지로 두 열을 함께 기준으로 그룹화합니다.
이를 개별 집합 및 총합계와 결합하면 하나의 질의에서 네 수준의 요약을 얻을 수 있습니다.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
(category),
()
);GROUPING() 함수
NULL은 '이 열이 그룹화되지 않음'을 의미할 수도 있고 실제 누락 데이터일 수도 있으므로, SQL에서는 둘을 구분할 수 있도록 GROUPING() 함수를 제공합니다.
GROUPING(col)은 현재 그룹화 집합에서 해당 열이 생략되었을 때, 즉 해당 NULL이 구조적 값일 때 1을 반환합니다. 열이 그룹화에 포함되었거나 실제 NULL 값일 때는 0을 반환합니다.
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_total,
GROUPING(category) AS is_category_total
FROM sales
GROUP BY GROUPING SETS (
(region),
(category),
()
);NULL 레이블 대체
보고서를 더 쉽게 읽을 수 있도록 구조적 NULL을 설명적인 레이블로 바꾸는 방식이 자주 사용됩니다. CASE WHEN GROUPING(...) = 1 THEN '모든 ...' ELSE 열 END를 사용하면 롤업 행에만 레이블을 대신 표시할 수 있습니다.
SELECT
CASE WHEN GROUPING(region) = 1 THEN 'All Regions' ELSE region END AS region,
CASE WHEN GROUPING(category) = 1 THEN 'All Categories' ELSE category END AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region),
(category),
()
);GROUPING SETS와 ROLLUP 비교
ROLLUP(a, b)는 (a, b), (a), () 그룹화 집합으로 확장되는 간결한 표현입니다. 항상 계층 구조에 따른 소계와 총합계를 추가합니다.
GROUPING SETS를 사용하면 어떤 조합을 표시할지 정확히 선택할 수 있어 완전히 제어할 수 있습니다. 전체 계층 구조가 필요하지 않다면 일부 수준을 생략할 수 있습니다. 아래 두 질의는 동일한 출력을 생성합니다.
-- Using ROLLUP
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category);
-- Equivalent explicit GROUPING SETS
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
);GROUPING SETS와 CUBE 비교
CUBE(a, b)는 나열된 열의 가능한 모든 조합인 (a, b), (a), (b), ()를 생성합니다. 차원 간 분석에 유용하지만 많은 행을 생성합니다.
GROUPING SETS를 사용하면 필요한 조합만 선택하여 결과를 집중된 형태로 유지하고 질의를 빠르게 실행할 수 있습니다.
-- CUBE produces 4 grouping sets for 2 columns
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category);
-- GROUPING SETS: omit the (category)-only set if not needed
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
);실용 사례: 매출 대시보드
실제 대시보드에서는 행 수준의 세부 정보, 부서별 소계, 총합계를 모두 하나의 결과 집합에서 제공해야 하는 경우가 많습니다. GROUPING SETS를 사용하면 애플리케이션 측 집계나 여러 번의 왕복 통신 없이도 이를 간단히 처리할 수 있습니다.
이 질의는 지역 및 범주별 세부 행, 지역만 기준으로 한 소계, 하나의 총합계 행을 반환하며, 총합계가 마지막에 표시되도록 모두 정렬합니다.
SELECT
COALESCE(region, 'TOTAL') AS region,
COALESCE(category, 'ALL') AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
)
ORDER BY
GROUPING(region),
region NULLS LAST,
GROUPING(category),
category NULLS LAST;빠른 확인
GROUPING SETS에 대한 이해도를 확인해 보십시오.
단원 요약
GROUPING SETS에 대해 다음과 같은 내용을 배웠습니다.
- GROUPING SETS를 사용하면 하나의 질의에서 여러 그룹화 조합을 정의할 수 있어 반복적인 UNION ALL 패턴을 대신할 수 있습니다.
- 각 집합은
GROUP BY GROUPING SETS (...)안에서 괄호로 묶은 열 목록으로 나열합니다. 빈 집합()은 총합계를 생성합니다. - 활성 집합에 포함되지 않은 열은 해당 행에서 NULL로 표시됩니다. 이러한 구조적 NULL을 감지하려면
GROUPING(col)을 사용하십시오. - ROLLUP과 CUBE는 일반적인 패턴을 위한 편리한 간결 표현이지만, GROUPING SETS를 사용하면 포함할 그룹화를 완전하고 정확하게 제어할 수 있습니다.
- COALESCE 또는 CASE WHEN GROUPING(...)과 결합하여 보고서의 NULL을 읽기 쉬운 레이블로 바꾸십시오.
자주 묻는 질문
“GROUPING SETS 설명” 강의는 무료인가요?
네 — “GROUPING SETS 설명” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“GROUPING SETS 설명”에서 뭘 배우나요?
원하는 그룹화만 정확히 선택합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“GROUPING SETS 설명” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 단일 GROUP BY를 넘어
- 소계를 위한 ROLLUP
- 모든 조합을 위한 CUBE
- GROUPING SETS 설명