문제
💡 Write a solution to find for each user, the join date and the number of orders they made as a buyer in 2019. Return the result table in any order.
테이블 형태
풀이
SELECT user_id AS buyer_id, join_date, SUM(CASE WHEN YEAR(order_date)=2019 THEN 1 ELSE 0 END) AS orders_in_2019
FROM Users AS u
LEFT JOIN Orders AS o ON u.user_id=o.buyer_id
GROUP BY user_id
해설
- 각 유저별 가입 일자와 2019년에 buyer로서 주문한 order 데이터의 개수를 출력하는 문제다
- 모든 유저가 출력되어야 하고, 거래 내역이 없을 시 0으로 출력하는 것이 핵심이다
FROM Users AS u
LEFT JOIN Orders AS o ON u.user_id=o.buyer_id
GROUP BY user_id
- 모든 유저가 출력되어야 하므로 Users(u)테이블을 기준으로 LEFT JOIN해준다. buyer로서 주문한 order 데이터 개수를 출력해야 하므로 테이블u의 user_id와 buyer_id 의 일치를 기준으로 조인한다(buyer_id는 테이블u의 FK).
- 테이블 u의 user_id를 기준으로 GROUP BY 한다
SELECT user_id AS buyer_id, join_date, SUM(CASE WHEN YEAR(order_date)=2019 THEN 1 ELSE 0 END) AS orders_in_2019
- user_id를 기준으로 그룹화했으나 출력할 때는 buyer_id로 출력해야 하므로 Alias로 컬럼명을 바꿔준다. 또한 CASE 문을 사용해서 order_date 컬럼 값이 2019년일 때 1을, 아니면 0을 부여하고 값을 SUM으로 모두 더해 유저별 2019년 buyer로서 주문한 order 데이터의 개수를 집계한다. 이러면 19년 거래 내역이 없을 때 0으로 출력할 수 있다
- 2124ms 약 상위 30%로 꽤 빠른 쿼리다
'SQL > 코딩테스트' 카테고리의 다른 글
[leetcode / MySQL] 1070. Product Sales Analysis III (0) | 2024.02.27 |
---|---|
[leetcode / MySQL] 626. Exchange Seats (0) | 2024.02.22 |
[leetcode / MySQL] 585. Investments in 2016 (0) | 2024.02.22 |
[leetcode / MySQL] 176. Second Highest Salary (0) | 2024.02.19 |
[프로그래머스 / MySQL] 진료과별 총 예약 횟수 출력하기 (0) | 2024.02.02 |