← 학습 카테고리

Learn

ClickHouse

47개 모듈 · 현재 26번째

ClickHouse 모듈 26/47 clickhouse-learn-26

WITH ROLLUP/CUBE/TOTALS — 소계·총계를 GROUP BY 하나로 한꺼번에

ClickHouse GROUP BY WITH ROLLUP/CUBE/TOTALS 및 ORDER BY WITH FILL 공식 문서 종합 (웹 리서치, 2026) — ClickHouse 공식 문서(sql-reference/statements/select/group-by, sql-reference/statements/select/order-by) ClickHouse 공식 문서 GROUP BY clause — ROLLUP/CUBE/TOTALS modifiers

이 모듈을 다 읽으면

  • WITH ROLLUP과 WITH CUBE가 만들어내는 소계 행의 개수와 계층이 왜 다른지 설명할 수 있다
  • WITH TOTALS가 앞의 두 수정자와 근본적으로 다른 지점을 설명할 수 있다

일반적인 GROUP BY가 그룹별 집계 결과만 한 줄씩 내는 것과 달리, 여러 단계의 소계나 전체 총계까지 같은 쿼리 하나로 함께 뽑아낼 수 있게 해주는 세 가지 GROUP BY 수정자(ROLLUP/CUBE/TOTALS)를 정리한다.

WITH ROLLUP — GROUP BY 목록 순서대로 계층적 소계

ROLLUP 수정자는 GROUP BY에 나열된 키 표현식의 '순서'를 기준으로 계층적 소계를 계산한다 — 예를 들어 GROUP BY year, month, day WITH ROLLUP이면, 가장 상세한 (year, month, day) 조합별 집계에 더해, 오른쪽에서부터 하나씩 접어가며 (year, month) 소계, (year) 소계, 그리고 전체 총계까지 총 4단계의 결과가 함께 나온다. 소계 단계에서는 이미 접혀 들어간 키 컬럼들이 0이나 빈 문자열 같은 기본값으로 표시돼, 그 행이 '집계된 상위 레벨'임을 구분할 수 있게 해준다.

핵심 포인트

  • ROLLUP은 GROUP BY 목록의 순서대로 오른쪽부터 하나씩 접어가며 계층적 소계 생성 — (year,month,day)→(year,month)→(year)→전체총계 순
  • 소계 행에서는 접혀 들어간 키 컬럼이 기본값(0/빈 문자열)으로 표시돼 상위 집계 레벨임을 구분

WITH CUBE — 가능한 모든 조합의 소계

CUBE 수정자는 ROLLUP처럼 특정 순서를 따라가는 게 아니라, GROUP BY 키 목록의 '모든 가능한 조합'에 대해 소계를 계산한다 — 3개 키(year, month, day)라면 2³=8가지 조합(가장 상세한 조합부터 전체 총계까지, 그리고 그 사이의 모든 부분 조합)에 대한 결과가 각각 나온다. ROLLUP보다 훨씬 많은 행을 만들어내는데, 이는 '어떤 순서로 접든' 나올 수 있는 모든 소계 관점을 한 번에 다 보고 싶을 때 쓰는 방식이기 때문이다. 그룹화에 참여하지 않는 컬럼은 여기서도 기본값(0/빈 값)으로 표시된다.

핵심 포인트

  • CUBE는 GROUP BY 키의 모든 가능한 조합에 대해 소계 계산 — 3개 키면 2³=8가지 조합, ROLLUP보다 훨씬 많은 행 생성
  • '어떤 순서로 접든' 나올 수 있는 모든 소계 관점을 한 번에 보고 싶을 때 사용, 비그룹화 컬럼은 기본값으로 표시

WITH TOTALS — 딱 한 줄, 전체 총계만

TOTALS는 ROLLUP/CUBE와 근본적으로 다르다 — 중간 소계 없이 딱 한 개의 추가 행만 계산하는데, 이 행은 키 컬럼들이 전부 기본값(0/빈 문자열)이고 집계 함수 컬럼들은 전체 행에 대해 계산된 값을 담는다. 즉 '전체 총계 한 줄만 덤으로 얻고 싶다'는 단순한 요구에 맞는 가벼운 수정자다. 출력 형식에 따라 표현 방식도 다른데, XML/JSON에서는 별도의 'totals' 필드로 나오고 TabSeparated/Pretty 형식에서는 본문 결과 뒤에 총계 행으로 붙는다 — 이 동작은 totals_mode 설정을 통해 HAVING 절과의 상호작용도 조정할 수 있다.

핵심 포인트

  • TOTALS는 중간 소계 없이 전체 총계 한 줄만 추가 — 키 컬럼은 기본값, 집계 함수 컬럼은 전체 행 기준 계산값
  • XML/JSON은 별도 'totals' 필드로, TabSeparated/Pretty는 본문 뒤 총계 행으로 표현 — totals_mode 설정으로 HAVING과의 상호작용 조정 가능