8장. 그룹화 분석하기
- 데이터를 분석할 때 단순히 데이터를 나열한 상태로 분석하기엔 충분하지 않은 경우가 있습니다.
- 특정 기준에 따라 데이터를 분류하고 데이터를 분석하면 좀 더 풍부한 인사이트를 얻을 수 있습니다.
- 이 글에선 데이터를 그룹으로 나누고 집계하는 방법인 그룹화 분석에 대해 알아보겠습니다.
📗 그룹화
📌 그룹화란?
- 그룹화란 데이터 분석 기법의 하나로, 데이터를 특정 기준에 따라 여러 그룹으로 나누고 그룹별 데이터를 요약하거나 분석하는 것입니다.
- 복잡한 데이터 사이에서 유의미한 패턴을 찾거나 특정 변수에 따른 행동이나 특성을 더 잘 이해하기 위해 수행합니다.
students 테이블 생성

학생들의 평균 키 구하기

📌 그룹화 (GROUP BY)
- GROUP BY절은 특정 칼럼을 기준으로 데이터를 그룹화하는 문법입니다.
SELECT 그룹화_칼럼, 집계_함수(일반_칼럼)
FROM 테이블명
WHERE 조건
GROUP BY 그룹화_칼럼
남자와 여자 각각 평균 키 구하기

- where 필터링 조건은 선택사항입니다.
- 이렇게 GROUP BY를 활용해 그룹화한 데이터를 집계함수(COUNT, SUM, AVG, MIN, MAX 등)을 이용해 계산함으로써 각종 요약 정보를 쉽게 뽑아낼 수 있습니다.
📌 그룹화의 특징
- GROUT BY절은 다음 3가지 특징이 있습니다.
1. 집계 함수와 함께 사용해야 한다.
- GROUP BY절은 하나 이상의 집계함수와 함께 사용해야 의미가 있습니다.
- 단순히 GROUP BY절만 사용하면 데이터를 그룹으로 묶기만 합니다.
- 유의미한 데이터 분석 결과를 얻으려면 집계작업을 거쳐야합니다.
- 단순히 남자, 여자 분리해서 보고싶다고 하신다면 GROUP BY만 사용할 수 있긴 합니다.
2. 여러 칼럼으로 그룹화할 수 있다.
- GROUP BY절로 데이터를 그룹화할 때 2개 이상의 칼럼을 기준으로 그룹화 할 수 있습니다.
- 이 경우 각 칼럼 조합에 따라 고유한 그룹이 형성됩니다.
SELECT 그룹화_칼럼1, 그룹화_칼럼2, 집계_함수(일반_칼럼)
FROM 테이블명
WHERE 조건
GROUP BY 그룹화_칼럼1, 그룹화_칼럼2;

- city(특정 도시)를 기준으로 그룹화한 후
- 다시 sale_date(판매 연도)를 기준으로 세부 그룹을 나누어
- 특정 도시의 연도별 총 매출을 집계해봅시다.

3. SELECT절에 올 수 있는 칼럼이 제한적이다
- GROUP BY로 그룹화한 쿼리의 SELECT절에 올 수 있는 칼럼은 GROUP BY절에서 지정한 그룹화 칼럼이거나, 집계함수이어야 합니다.
- 그룹화 칼럼이나 집계함수가 아닌 다른 값을 SELECT하려고 하면 에러가 발생합니다.
- 예를 들어 아래 사진처럼 gender을 그룹화한 칼럼에서 그룹화에 포함되지도 않고, 집계함수도 아닌 height을 SELECT하려고 하면 에러가 발생합니다.

📗 그룹화 필터링, 정렬, 조회 개수 제한
📌 그룹화 필터링(HAVING)
- 그룹화 필터링이란 그룹화한 결과에서 특정 조건을 만족하는 그룹의 데이터만 가져오는 것입니다.
- 예를 들어 성별로 그룹화한 후 평균 키가 170이 넘는 데이터만 가져온다거나, 결제 유형별로 그룹화한 후 결제 금액이 5만원이 넘는 데이터만 가져오는 등의 상황에서 그룹 필터링을 사용합니다.
- 그룹화 필터링은 GROUP BY절에 HAVING절을 추가해 수행합니다.
- HAVING절은 GROUP BY로 나눈 그룹에 필터링 조건을 거는 역할을 합니다.
SELECT 그룹화_칼럼, 집계_함수(일반_칼럼)
FROM 테이블명
WHERE 일반_필터링_조건
GROUP BY 그룹화_칼럼
HAVING 그룹_필터링_조건;
- 새로 payments 테이블을 만들어 그룹화 필터링 실습을 진행하겠습니다.

ptype별로 그룹화하고, 평균 결제 금액이 40000원 이상인 데이터 조회하기

📌 HAVING절과 WHERE절 차이
- HAVING절은 WHERE절과 비슷하게 작동하는 듯 보이지만 실제로 차이가 있습니다.
- WHERE절은 개별 튜플에 대해 필터링을 수행하지만 HAVING절은 그룹화한 결과, 즉 그룹 단위로 필터링을 수행합니다.
- WHERE은 튜플 하나에 대해서만 필터링을 수행합니다.
- HAVING은 그룹화한 절 안에 있는 튜플들을 통해 필터링을 수행하게 됩니다.
📗 정렬
📌 정렬(ORDER BY)
- 정렬이란 쿼리 결과의 데이터를 오름차순 또는 내림차순으로 배열하는 것입니다.
- SQL에서 특정 칼럼을 중심으로 정렬할 때는 ORDER BY절을 사용합니다.
- ORDER BY절엔 뒤에 붙는 ASC와 DESC 키워드가 존재합니다.
- 이 키워드를 통해 결과를 오름차순 정렬할지 내림차순 정렬할지 정할 수 있습니다.
ASC, DESC
ASC : 오름차순
DESC : 내림차순
SELECT *
FROM 테이블명
WHERE 조건
ORDER BY 정렬_칼럼1 [ASC || DESC], 정렬_칼럼2 [ASC || DESC]..;
단일 칼럼으로 정렬하기
- payments 테이블에서 결제 금액이 높은 순서대로 데이터를 조회해봅시다

다중 칼럼으로 정렬하기
- 정렬은 2개 이상의 칼럼으로 기준을 잡을수도 있습니다.
- ptype의 오름차순으로 정렬한 후, 결제 유형이 같은 데이터를 다시 amount의 내림차순으로 정렬해봅시다.

📌 조회 개수 제한(LIMIT)
- 조회 개수 제한은 상위 N개 튜플을 조회할 때 사용하는 명령입니다.
- LIMIT절을 이용해 반환하려는 튜플의 개수 N을 정의합니다.
SELECT 칼럼1, 칼럼2, ...
FROM 테이블명
LIMIT N;
- payments 테이블에서 amount의 내림차순으로 정렬하고 상위 3개 데이터만 조회해봅시다.

LIMIT 시작점 정하기(OFFSET)
- 만약 상위 튜플이 아닌 중간튜플을 가져오고싶다면 LIMIT절에 OFFSET 키워드를 추가해 읽어 올 데이터의 시작 지점을 조정할 수 있습니다.
SELECT 칼럼1, 칼럼2, ...
FROM 테이블명
LIMIT N OFFSET M;
-- N : 가져올 튜플의 개수, M : 건너뛸 튜플의 개수
- amount의 상위 4~6등 까지의 데이터를 구해봅시다.

📌 마켓 DB 만들어서 그룹화 실습하기
- 깃허브에 코드를 제공해주는걸 이제야 알았습니다..😅
- 이제 손가락이 덜 아프겠군요
📌 데이터셋 만들기
상품 유형별 집계하기
- products 테이블을 product_type별로 나눠 유형별 상품 개수, 최고 가격, 최저 가격을 구해봅시다.

사용자별 주문 총액 필터링하기
- 사용자별 주문 총액을 구해 주문 총액이 30,000원 이상인 주문자만 조회해봅시다.

가장 많이 팔린 상품 TOP3 찾기
- 상품별 판매 수량을 집계해 가장 많이 팔린 상품 TOP3를 조회해 봅시다.
- 판매완료가 아닌 장바구니에 담긴 상품은 취급하지 않습니다.
