Problem
Difficulty : Medium
Write an SQL query to find for each user, the join date and the number of orders they made as a buyer in
2019
.
My Solutions
-- OUTPUT : buyer_id | join_date | orders_in_2019 |
SELECT
user_id AS `buyer_id`,
join_date,
-- the number of orders
COUNT(DISTINCT order_id) AS `orders_in_2019`
FROM Users u
-- LEFT JOIN : SHOULD CONTAIN ALL DATA FROM Users
LEFT JOIN Orders o
ON o.buyer_id = u.user_id
-- ONLY orders they made as a buyer in 2019
AND YEAR(order_date) = 2019
GROUP BY 1, 2
Lessons Learned
문제에 유일한 조건“ONLY orders they made as a buyer in 2019” 을 쿼리로 간단히 작성하는 법을 정리한다.
쿼리실행순서 FROM > JOIN > WHERE
FROM Users u
LEFT JOIN Orders o ON o.buyer_id = u.user_id
WHERE YEAR(order_date) = 2019
WHERE YEAR(order_date) = 2019
- 쿼리 실행순서 FROM > JOIN > WHERE 순이다.
- 조인 후 실행되는
WHERE
절 조건으로 인해, 2019년에 주문건이 없는 고객 데이터는 제거된다. 2019년에 주문건이 없는 유저라도 집계해서 0으로 출력해야하므로WHERE
절에 조건을 추가하면 안된다.
조인 조건문에 AND
로 조건문 추가하기
FROM Users u
LEFT JOIN Orders o ON o.buyer_id = u.user_id
AND YEAR(order_date) = 2019
LEFT JOIN Orders o ON o.buyer_id = u.user_id AND YEAR(order_date) = 2019
ON o.buyer_id = u.user_id
- Users 테이블에 Orders 테이블을
LEFT JOIN
을 함에 있어 조인 키를 설정한다.
- Users 테이블에 Orders 테이블을
AND YEAR(order_date) = 2019
- 조인키 조건에 이어서, Orders 테이블에서 2019년 주문 데이터만 불러오는 조건을 추가한다.