본문 바로가기
SQL/SQL 스터디

GROUP BY와 HAVING 파헤치기 - 문과생 SQL 독학 시리즈4

by davi_kr 2023. 4. 29.

목차

    반응형

    "Everything is available basically for free. You can learn anything you want for free." - Elon Musk의 인터뷰 중

    머스크의 말처럼 모두 무료로 접할 수 있고 무엇이든 할 수 있으니..

    무료로 접할 수 있는 정보들을 제게 맞게 최적화해서 정리해보려고 합니다.

     

    이 글에선 GROUP BY와 HAVING에 대해 자세히 알아보겠습니다.

    아래는 예시로 사용할 sales 테이블입니다.

     

    id product price quantity sale_date
    1 Apple 1000 5 2023-01-01
    2 Banana 500 10 2023-01-02
    3 Orange 700 8 2023-01-03
    4 Apple 1100 7 2023-01-04
    5 Banana 450 15 2023-01-05

     

    1. GROUP BY 사용

    GROUP BY는 특정 열(column)의 값에 따라 데이터를 그룹화합니다.

    SELECT product, SUM(price * quantity) as total_sales
    FROM sales
    GROUP BY product;

     

    해석 > sales 테이블에서 product 기준으로 묶은 다음(그룹핑한 다음), product 별로 price와 quantity를 곱한 total_sales를 조회해줘

    (쉽게는.. 상품별 총 판매 금액을 조회해줘)

    결과)

    product total_sales
    Apple 12700
    Banana 11750
    Orange 5600

     

    2. GROUP BY, HAVING 사용

    HAVING은 그룹화된 데이터에 조건을 적용할 때 사용합니다. 

    SELECT product, SUM(price * quantity) as total_sales
    FROM sales
    GROUP BY product
    HAVING total_sales >= 6000;

     

    해석 > sales 테이블에서 product 기준으로 묶은 다음, product 별로 price와 quantity를 곱한 total_sales를 구하고, 그 중에서 total_sales가 6000 이상인 값을 조회해줘

    결과) 

    product total_sales
    Apple 12700
    Banana 11750

     

    3. GROUP BY, HAVING, WHERE 사용

    SELECT product, SUM(price * quantity) as total_sales
    FROM sales
    WHERE sale_date > '2023-01-03'
    GROUP BY product
    HAVING total_sales >= 5000;

    해석 > sales 테이블에서 sale_date가 23년 1월 4일부터인 값들을 product 기준으로 묶은 다음,  product 별로 price와 quantity를 곱한 total_sales를 구하고, 그 중에서 total_sales가 5000 이상인 값을 조회해줘

    결과)

    product total_sales
    Apple 7700
    Banana 6750

     

    좀 더 디테일한 예시를 위해 예시 테이블을 하나 더 들어보겠습니다.

    아래는 예시로 사용할 sales1 테이블입니다.

    product sale_date store price quantity
    Apple 2023-01-01 Seoul 1000 2
    Apple 2023-01-02 Busan 1000 1
    Apple 2023-01-03 Busan 1000 4
    Banana 2023-01-01 Seoul 500 5
    Banana 2023-01-02 Busan 500 3
    Banana 2023-01-03 Seoul 500 7
    Orange 2023-01-01 Seoul 2000 1
    Orange 2023-01-02 Seoul 2000 2
    Orange 2023-01-03 Busan 2000 1

     

    4. GROUP BY 여러개 사용

    SELECT product, store, SUM(price * quantity) as total_sales
    FROM sales1
    GROUP BY product, store;

     

    해석 > sales1 테이블에서 product, store를 기준으로 묶은 다음, product와 store 별로 price와 quantity를 곱한 total_sales를 조회해줘(product로 묶고 그 다음에 store로 묶음)

    결과)

    product store total_sales
    Apple Seoul 2000
    Apple Busan 5000
    Banana Seoul 6000
    Banana Busan 1500
    Orange Seoul 6000
    Orange Busan 2000

     

    5. GROUP BY, HAVING 여러개 사용

    SELECT product, store, SUM(price * quantity) as total_sales, SUM(quantity) as total_quantity
    FROM sales1
    GROUP BY product, store
    HAVING total_sales >= 3000 AND total_quantity >= 5;

     

    해석 > sales1 테이블에서 product, store를 기준으로 묶은 다음, product와 store 별로 price와 quantity를 곱한 total_sales를 구하고 그 중에서 total_sales가 3000 이상이면서 total_quantity가 5 이상인 값을 알려줘

    결과)

    product store total_sales total_quantity
    Apple Busan 5000 5
    Banana Seoul 6000 12

     

    6. 참고 문헌

    통계 교육원 SQL 강의: 데이터 분석을 위한 SQL 입문(2023) - https://sti.kostat.go.kr/coresti/site/main.do

    부스트코스 SQL 강의: 기초 데이터 분석을 위한 핵심 SQL - https://www.boostcourse.org/

    반응형

    댓글