[SQLD 13화] GROUP BY 기본 집계 함수(COUNT, SUM, MIN, MAX)의 문법과 실무 통계 요약 전략 (SQLD, 직장인 SQL)

1. 낱개의 데이터에서 비즈니스 지표로: GROUP BY의 본질

12화에서 우리는 두 개 이상의 데이터 집합을 세로 방향으로 길게 확장하여 하나의 통합 분석 집합을 완성하는 UNIONUNION ALL 연산자의 문법 구조를 살펴보았습니다. 집합 연산과 조인(Join)을 통해 분석에 필요한 거대한 원천 데이터(Raw Data) 집합을 구성하고 나면, 분석가는 수천만 건에 달하는 한 줄 한 줄의 상세 거래 로그들을 그대로 나열하기보다 특정 기준에 따라 묶어서 요약된 통계치를 산출해 내야 하는 과제를 마주하게 됩니다.

경영진이나 기획 부서에서 요구하는 최종 보고서의 형태는 대개 “지난달 ‘점포별’ 총 매출액과 총 판매 건수를 요약해 달라”거나 “올해 ‘카테고리별’ 최고가 상품과 최저가 상품의 금액을 분석해 달라”는 식의 그룹화된 지표입니다.

이처럼 수많은 로우(Row) 데이터를 특정 기준 칼럼에 따라 한 그룹으로 묶어주는 나침반 역할을 하는 명령어가 바로 GROUP BY이며, 그 묶인 그룹 안에서 실제 덧셈이나 건수 계산 등의 수학적 연산을 수행하는 도구가 기본 집계 함수(Aggregate Function)입니다. 본 연작 시리즈는 기업형 대용량 데이터 처리에 자주 활용되는 테라데이터 SQL 환경을 기준으로 필수 집계 함수의 문법 규칙과 실무 요약 전략을 설명하겠습니다.

2. GROUP BY와 집계 함수의 표준 문법 규칙

GROUP BY 절은 기본적으로 FROM 절과 WHERE 절 뒤에 위치하는 문법적 순서를 가집니다. 이때 입문자들이 가장 많이 범하는 문법적 에러를 방지하기 위해서는 다음과 같은 ‘SELECT-GROUP BY 일치 원칙’을 명확히 인지해야 합니다.

-- GROUP BY와 집계 함수의 가장 표준적인 문법 구조
SELECT 
    GROUP_KEY_COLUMN           -- 그룹화의 기준이 되는 칼럼
  , SUM(CAL_TARGET_COLUMN)     -- 집계 함수 적용 칼럼
FROM 
    TABLE_NAME
WHERE 
    FILTER_CONDITION
GROUP BY 
    GROUP_KEY_COLUMN;          -- SELECT 절에 나열된 기준 칼럼과 정확히 일치해야 함

⚠️ 실무 쿼리 빌드 시 절대로 누락하면 안 되는 철칙

  • 일반 칼럼과 집계 함수의 공존 법칙: 만약 SELECT 절에 집계 함수(예: SUM, COUNT 등)에 감싸지지 않은 순수한 일반 칼럼(GROUP_KEY_COLUMN)을 적었다면, 해당 칼럼은 무조건 GROUP BY 절에 빠짐없이 기재되어야 합니다. 이를 누락할 경우 데이터베이스 엔진은 SELECT 절의 일반 칼럼과 GROUP BY 절 간 불일치 오류를 발생시키며 실행을 중단합니다. 기준을 정하지 않은 채 줄을 세울 수는 없기 때문입니다.

3. 필수 집계 함수 4총사의 속성과 메커니즘

실무 통계 분석에서 가장 높은 빈도로 활용되는 4가지 핵심 집계 함수의 문법적 특징을 객관적으로 짚어보겠습니다.

  • SUM(칼럼명): 지정된 그룹 내의 모든 숫자 데이터를 더하여 총합을 구합니다. 오직 숫자형 데이터 타입에만 적용할 수 있습니다.
  • *COUNT(칼럼명 또는 *): 지정된 그룹 내 데이터의 행(Row) 수를 계산합니다. COUNT(*) 형식을 취하면 NULL 값을 포함한 전체 행의 개수를 세어주며, COUNT(칼럼명) 형식을 취하면 해당 칼럼 내에 결측치가 제외된 실물 데이터의 개수만을 걸러서 계산하는 독특한 속성을 가집니다.
  • MAX(칼럼명): 그룹 내에서 가장 큰 최댓값을 찾아냅니다. 숫자뿐만 아니라 문자(문자열 비교 기준상 가장 큰 값)나 날짜(가장 최근 날짜) 타입에도 폭넓게 적용할 수 있습니다.
  • MIN(칼럼명): 그룹 내에서 가장 작은 최솟값을 도출합니다. 숫자, 문자, 날짜(가장 과거 날짜) 등 다차원형 데이터 타입에 모두 대응할 수 있어 유용하게 쓰입니다.

4. 현업 비즈니스 사례로 보는 실무 통계 요약 전략

이러한 집계 함수군이 실무 커머스 매출 실적 분석 과정에서 어떻게 유기적으로 결합하여 최종 요약 보고서로 변모하는지, 가상의 비즈니스 시나리오를 통해 쿼리를 리팩토링해 보겠습니다.

📊 [실무 사례 예시: 마케팅 팀 강 대리의 채널별 실적 분석]

온라인 종합 이커머스 기업의 영업 분석 담당자인 강 대리는 브랜드 기획 부서로부터 다음과 같은 통계 데이터 산출 요청을 받았습니다.

  • 요청 내용: “7월 12일 당일 발생한 매출 테이블을 기반으로, 결제 채널별(모바일, PC 등) 총 매출액, 총 거래 건수, 단일 거래 기준 최고 결제 금액최저 결제 금액을 단 하나의 요약 보고서 형태로 구성해 주세요.”

강 대리는 채널코드별로 데이터를 집계하고 마케팅 KPI 메트릭을 도출하기 위해 다음과 같이 표준 GROUP BY 쿼리를 설계하여 실행했습니다.

-- [올바른 예시] GROUP BY와 필수 집계 함수 4종을 결합한 실무 통계 요약 쿼리
SELECT 
    CHANNEL_CD                           -- 집계 기준: 채널코드 (일반 칼럼)
  , COUNT(ORDER_NO)   AS TOTAL_ORD_CNT   -- 총 거래 건수 요약
  , SUM(PAY_AMT)       AS TOTAL_SALE_AMT  -- 총 매출액 합산 요약
  , MAX(PAY_AMT)       AS MAX_PAY_AMT     -- 단일 기준 최고 결제액 포착
  , MIN(PAY_AMT)       AS MIN_PAY_AMT     -- 단일 기준 최저 결제액 포착
FROM 
    DW_MART.DAILY_ORDER_LOG
WHERE 
    ORDER_DT = '2026-07-12'              -- 7월 12일 당일 실적으로 범위 압축
GROUP BY 
    CHANNEL_CD                           -- SELECT 절의 채널코드와 일치화
ORDER BY 
    TOTAL_SALE_AMT DESC;                 -- 총 매출액이 높은 채널순으로 정렬

💡 요약 결과 집합의 비즈니스 가공 포인트

위와 같이 쿼리를 빌드하면 수천만 건의 상세 거래 데이터가 채널코드별 그룹 개수(예: 모바일, PC, 상담원 결제 등 3~4행)만큼 요약된 결과 행으로 압축되어 출력됩니다. 이를 통해 마케팅 기획 부서는 “모바일 채널이 총 매출액과 거래 건수 면에서 압도적 우위를 점하고 있으며, 최고 결제 금액 역시 모바일에서 발생했다”는 명확한 인사이트를 단 1초 만에 확인하고 의사결정을 내릴 수 있게 됩니다.

5. 팩트 체크 및 데이터 분석가의 관점 점검 (NULL의 역습 방어)

기술 콘텐츠의 신뢰성과 데이터 정밀도를 지키기 위해, 집계 함수 내에 NULL(결측치) 데이터가 유입되었을 때 발생하는 내부 연산 사실 관계들을 명확히 점검해 보겠습니다.

  • 집계 함수를 실행할 때 칼럼 내의 NULL 값들은 사칙연산처럼 에러를 유발하는가?
    • 팩트 체크: 그렇지 않습니다. 6화에서 배웠듯이 일반 칼럼 간의 사칙연산(A + B)은 어느 한쪽이 NULL이면 결과 전체가 NULL로 증발하는 치명적인 특성을 지녔습니다. 하지만 SUM, AVG, MAX, MIN 같은 대부분의 그룹 집계 함수들은 데이터 세트 내에 존재하는 NULL 값을 계산 대상에서 제외하고 나머지 유효한 값만 대상으로 연산하도록 설계되어 있습니다. 예를 들어 10명의 구매 데이터 중 2명이 결측치(NULL) 상태라 할지라도, SUM(PAY_AMT) 연산은 이를 에러로 뿜지 않고 나머지 8명의 금액만 정상적으로 더하여 숫자를 반환하므로 안심하고 사용하셔도 무방합니다.
  • COUNT(*)와 COUNT(칼럼명)의 결과값은 언제나 완벽히 일치하는가?
    • 팩트 체크: 데이터 상태에 따라 격차가 벌어질 수 있으므로 실무에서 가장 주의해야 합니다. COUNT(*)는 테이블의 ‘물리적인 행 수 전체’를 세어주기 때문에 특정 칸이 비어있거나 NULL이어도 무조건 카운트 1을 올립니다. 반면 COUNT(PAY_AMT)처럼 괄호 안에 특정 칼럼명을 지정해 주면, 해당 칼럼 값이 NULL인 행들은 연산 대상에서 제외하고 숫자가 채워진 행만 카운트합니다. 만약 10행의 데이터 중 2행이 결측치라면 COUNT(*)10을 반환하지만, COUNT(PAY_AMT)8을 반환하므로 전체 회원수 대비 실제 결제 회원율 등을 구하는 분수식 연산 시 두 명령어의 속성 차이를 명확히 분리하여 매칭해야 왜곡을 막을 수 있습니다.

6. 13화 요약 및 실무 그룹화 집계 자가 진단 체크리스트

쿼리를 빌드하고 대용량 시스템 서버에 명령을 상정하기 전, 데이터 요약의 논리적 결점이 없는지 스스로 진단할 수 있는 요약 가이드를 제공합니다.

체크포인트발생 가능한 실무 리스크현직 분석가의 권장 대안 및 조치
SELECT 절 일반 칼럼의 GROUP BY 누락문법 에러(“Invalid Usage”) 발생하며 쿼리 중단집계 함수에 감싸이지 않은 칼럼을 복사하여 GROUP BY 절 뒤에 반드시 명시
집계 대상 데이터가 없을 때의 SUM 결과 처리최종 반환 결과가 공백(NULL)으로 출력되어 레이아웃 왜곡6화에서 배운 기법을 응용하여 COALESCE(SUM(PAY_AMT), 0) 형태로 방어막 설치
COUNT(*) 와 COUNT(칼럼)의 선택 오류결측치 유무에 따른 수치 차이로 통계 수치의 무결성 훼손단순 물리적 건수는 COUNT(*), 유효 거래 고객수 등은 COUNT(CUST_NO) 구별 사용

7. 결론 및 다음 화 예고

이번 13화에서는 낱개의 로우 데이터 파편들을 그룹별로 묶어 정밀한 비즈니스 지표를 산출해 내는 통계 분석의 핵심인 GROUP BY 문법 구조와 필수 집계 함수 4종의 메커니즘을 다각도로 점검해 보았습니다. 원천 데이터를 가독성 높은 비즈니스 서머리 리포트로 압축해 내는 그룹화 역량은 사내 데이터 분석가의 가치를 정량적으로 증명해 주는 중요한 이정표가 됩니다.

기본적인 GROUP BY가 지정한 단일 층위의 그룹 요약만을 보여준다면, 실무 보고서에서는 단 한 줄의 쿼리로 대그룹, 중그룹, 소그룹의 중간 합계와 전사 총합계를 입체적으로 나열해야 하는 고난도 상황과 마주하게 됩니다.

이어지는 14화에서는 일반적인 그룹화를 한 단계 확장하여, 일별-월별-년별 혹은 매장별-부서별 매출의 계층적 중간 소계(Subtotal)와 최종 총합계(Grand Total)를 단 한 번의 명령어로 깨끗하게 도출해 대시보드 원천 데이터를 빌드해 주는 강력한 확장 문법인 GROUP BY ROLLUP의 세계를 집중 분석해 보겠습니다. 현직자들이 여러 단계의 소계 데이터를 UNION ALL로 직접 조합하던 방식을 GROUP BY ROLLUP 문법으로 단순화하는 실무 전략에 대해 알아보겠습니다.

댓글 남기기