1 문제 1: 상품별 반복 주문 사용자 조회
1.1 문제 정보
| 항목 | 내용 |
|---|---|
| 출처 | 튜터 생성 (앵커: Programmers “재구매가 일어난 상품과 회원 리스트 구하기” Lv.2) |
| 난이도 | Level 2 |
| SQL 유형 | GROUP BY 다중 컬럼, HAVING |
1.2 문제 설명
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT NOT NULL,
product_id INT NOT NULL,
order_date DATE NOT NULL
);
INSERT INTO orders VALUES
(1, 101, 201, '2024-01-10'),
(2, 101, 202, '2024-01-15'),
(3, 102, 201, '2024-02-01'),
(4, 101, 201, '2024-02-10'),
(5, 103, 203, '2024-02-20'),
(6, 102, 201, '2024-03-20'),
(7, 103, 201, '2024-03-15'),
(8, 104, 204, '2024-03-25');동일한 상품을 2회 이상 주문한 사용자와 상품 조합을 조회하라. - 출력: user_id, product_id, order_count - 정렬: user_id 오름차순, product_id 내림차순
기대 결과:
| user_id | product_id | order_count |
|---|---|---|
| 101 | 201 | 2 |
| 102 | 201 | 2 |
1.3 최종 풀이
SELECT user_id, product_id, COUNT(product_id) AS order_count
FROM orders
GROUP BY user_id, product_id
HAVING order_count >= 2
ORDER BY user_id ASC, product_id DESC;GROUP BY user_id, product_id: 사용자-상품 조합별로 묶어야 중복 주문을 셀 수 있다HAVING order_count >= 2: 집계 결과에 대한 필터 → HAVING 사용 (WHERE는 집계 전 필터)ORDER BY user_id ASC, product_id DESC: 1차 오름차순, 2차 내림차순
1.4 Tips
- 핵심 개념:
GROUP BY 컬럼1, 컬럼2— 다중 컬럼 그룹핑,HAVING 집계조건 - 함정:
GROUP BY user_id만 쓰면 상품 구분 없이 사용자 단위로 묶여 결과가 달라진다. 조합별로 세려면 그룹 기준에 두 컬럼을 모두 포함해야 한다 - WHERE vs HAVING:
WHERE는 GROUP BY 이전에 행을 필터링,HAVING은 GROUP BY 이후 집계 결과를 필터링