2025. 12. 14. 21:00ㆍSQL
지난 포스팅에서는 SUM, AVG 같은 함수로 전체 데이터를 뭉뚱그려 요약하는 법을 배웠다.
하지만 사장님은 "전체 매출"만 궁금해하지 않는다.
"그래서, 강남점이 잘했어, 홍대점이 잘했어?", "어떤 영화 장르가 돈이 돼?"
이런 질문에 답하려면 데이터를 "끼리끼리 묶어서(Grouping)" 비교해야 한다.
엑셀에서는 '피벗 테이블'을 써야 하지만, 데이터가 많으면 역시나 버벅거린다.
오늘은 SQL의 꽃이자 분석의 핵심인 GROUP BY와 HAVING을 실습했다.
1. 등급별로 쪼개서 세기 (GROUP BY)
"영화 등급(G, PG, R 등)별로 영화가 몇 편씩 있을까?"
전체 개수가 아니라, 등급이라는 범주(Category)별로 통계를 내고 싶을 때 GROUP BY를 쓴다.
SELECT rating, COUNT(*)
FROM film
GROUP BY rating;

GROUP BY rating 한 줄만 추가했더니, 알아서 등급별로 그룹을 짓고 그 안에서의 개수(COUNT)를 계산해 줬다. 엑셀 피벗 테이블을 만드는 과정보다 훨씬 빠르고 직관적이다.
2. 직원별 실적 랭킹 매기기 (GROUP BY + SUM)
"누가 일을 더 잘했나?"
직원(staff_id)별로 결제 금액(amount)을 다 더해서, 매출이 높은 순서대로 줄을 세워보자.
SELECT staff_id, SUM(amount) AS 총매출
FROM payment
GROUP BY staff_id
ORDER BY 총매출 DESC;

단 4줄의 쿼리로 직원별 성과표가 완성되었다. (2번 직원이 판매왕이다!)
3. 그룹에 조건 걸기 (HAVING) ⭐
여기서 가장 중요한 개념이 나온다.
"총매출이 100달러가 넘는 VIP 고객만 보고 싶다면?"
처음엔 습관적으로 WHERE를 쓰려 했지만, 에러가 난다. 왜냐하면 WHERE는 데이터를 묶기 전에 거르는 녀석이기 때문이다.
그룹화한 뒤의 결과(합계, 평균 등)를 거를 때는 반드시 HAVING을 써야 한다.
SELECT customer_id, SUM(amount)
FROM payment
GROUP BY customer_id
HAVING SUM(amount) > 100; -- 합계가 100 초과인 그룹만!

💡 면접 단골 질문: WHERE vs HAVING
이 둘을 구분하는 건 SQL 기초의 핵심이다.
- WHERE: 재료 손질 단계. 요리하기 전에 상한 재료(개별 행)를 버리는 것.
- HAVING: 요리 완성 후 간보기. 다 만든 요리(그룹화 결과) 중에서 맛없는 걸 버리는 것.
4. 끝판왕 쿼리: VIP 중의 VIP 찾기
오늘 배운 걸 총동원해서 "100달러 이상 쓴 VIP 중, 가장 많이 쓴 Top 10"을 뽑아봤다.
SELECT customer_id, SUM(amount) AS 총사용액
FROM payment
GROUP BY customer_id
HAVING SUM(amount) > 100
ORDER BY 총사용액 DESC
LIMIT 10;

이 쿼리 하나면 웬만한 데이터 추출 요청은 다 해결할 수 있을 것 같다. 이제야 내가 데이터를 '지배'하고 있다는 느낌이 든다.
📝 오늘의 문법 요약 (Cheat Sheet)
| 문법 | 역할 | 예시 |
| GROUP BY | 특정 컬럼 기준으로 그룹화 | GROUP BY gender (성별로 묶기) |
| HAVING | 그룹화된 결과 필터링 | HAVING SUM(price) > 1000 |
| ORDER BY | 정렬 | ORDER BY SUM(price) DESC |
[데이터 분석 독학기 #8 끝]
'SQL' 카테고리의 다른 글
| "누가 진짜 VIP인가?" SQL로 1분 만에 고객 등급 산정 시스템 만들기 (CASE WHEN) (0) | 2025.12.26 |
|---|---|
| 머신러닝의 8할은 전처리? SQL로 지저분한 데이터 예쁘게 다듬기 (문자열/날짜 함수) (0) | 2025.12.15 |
| 사장님이 "총매출 얼마야?" 물으실 때, 엑셀 켜지 않고 1초 만에 대답하는 법 (SQL 집계함수) (0) | 2025.12.14 |
| 뒤죽박죽 데이터가 한눈에 들어오는 기적: SQL 정렬과 검색 (ORDER BY, LIKE) (0) | 2025.12.08 |
| 엑셀 필터 걸다가 퇴근 못할 뻔... SQL WHERE절로 100만 건 데이터 0.1초 만에 찾기 (0) | 2025.12.07 |