데이터 집계

데이터 분석은 비즈니스 의사결정의 핵심이다. 특히 쇼핑몰 등의 서비스 운영에서는 주문 현황, 매출, 고객 행동 등을 파악하는 것이 중요하다. SQL의 집계 함수(Aggregate Functions)는 이처럼 방대한 데이터를 요약이서하고 분석을 도와준다.

  • Aggregate Functions: 어디선가 많이 들어본 반가운 Aggregate이다. 검색을 해보니 “집계 함수는 일반적으로 여러 행의 값 집합에 대해 계산을 수행하고 단일 요약 값을 반환합니다. 이러한 함수는 데이터베이스 쿼리, 특히 GROUP BY 절에서 데이터로부터 인사이트를 도출하는 데 일반적으로 사용됩니다.”라고 나온다.

order_stat table schema

CREATE TABLE order_stat (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_name VARCHAR(50),
    category VARCHAR(50),
    product_name VARCHAR(100),
    price INT,
    quantity INT,
    order_date DATE
);

order_stat 데이터

NULL 값과 집계 함수

데이터는 종종 누락된 값(NULL)이 포함될 수 있다. 집계 함수는 NULL 값을 다루는 방식에 따라 결과가 달라지므로, 이 차이를 이해하는 것이 중요하다

  • COUNT(*): 테이블의 모든 행 수를 반환한다. NULL 값의 존재 여부와 관계없이 물리적인 행의 개수를 센다
  • COUNT(컬럼명): 지정된 컬럼에서 NULL이 아닌 값의 개수만 센다
SELECT
    COUNT(*) AS `전체 주문 건수`,          -- 결과: 11 (NULL 포함)
    COUNT(category) AS `카테고리 등록 건수` -- 결과: 10 (NULL 제외)
FROM
    order_stat;

주요 집계 함수

총 주문 건수 파악

  • COUNT(*): 전체 주문 건수를 파악하는 데 사용된다
SELECT COUNT(*) FROM order_stat; -- 총 11건의 주문

합계와 평균 계산

  • SUM(expression): 지정된 표현식의 합계를 계산한다
  • AVG(expression): 지정된 표현식의 평균을 계산한다
    • 참고: SUM()과 AVG()는 계산 과정에서 NULL 값을 자동으로 제외한다

총 매출액 및 평균 주문 금액

SELECT
    SUM(price * quantity) AS `총 매출액`,     -- 개별 상품 가격 * 수량의 총합
    AVG(price * quantity) AS `평균 주문 금액` -- 개별 상품 가격 * 수량의 평균
FROM
    order_stat;

총 판매 수량 및 주문당 평균 수량

SELECT
    SUM(quantity) AS `총 판매 수량`,    -- 판매된 모든 상품 수량의 합
    AVG(quantity) AS `주문당 평균 수량` -- 주문당 평균 구매 수량
FROM
    order_stat;

최대 / 최소값 찾기

  • MAX(expression): 지정된 표현식의 최댓값을 반환한다
  • MIN(expression): 지정된 표현식의 최솟값을 반환한다
SELECT
    MAX(price) AS `최고가`, -- 판매된 상품 중 가장 비싼 단일 상품 가격
    MIN(price) AS `최저가`  -- 판매된 상품 중 가장 저렴한 단일 상품 가격
FROM
    order_stat;

최초 주문일 및 최근 주문일

SELECT
    MIN(order_date) AS `최초 주문일`, -- 가장 오래된 주문 날짜
    MAX(order_date) AS `최근 주문일`  -- 가장 최근 주문 날짜
FROM
    order_stat;

고유 고객 수 파악

  • DISTINCT: 중복된 값을 제외하고 고유한 값의 개수만 셀 때 사용한다. COUNT() 함수와 함께 사용된다

총 주문 건수 대비 순수 고객 수 파악

SELECT
    COUNT(customer_name) AS `총 주문 건수`,          -- 고객 이름 중복 포함 (총 11건)
    COUNT(DISTINCT customer_name) AS `순수 고객 수` -- 고객 이름 중복 제외 (총 5명)
FROM
    order_stat;

SQL 쿼리를 통해 ‘총 주문 건수’는 11건이지만, 실제 구매한 ‘순수 고객 수’는 5명이라는 것을 정확히 알 수 있다. 이는 고객별 재구매율 등을 분석하는 데 중요한 기초 자료가 된다

출처 – 김영한 님의 강의 김영한의 실전 데이터베이스 입문 – 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)