📝 1158. Market Analysis I
🔹 시장분석 1
2019년 각 사용자별 가입 날짜와 구매자로서 주문한 횟수를 찾는 솔루션을 작성하세요.
어떤 순서로든 결과 테이블을 반환합니다.
📝 문제 설명
- 사용자(User)마다 가입 날짜를 확인하고,
- 2019년에 주문자로 참여한 주문 횟수를 계산해야 합니다.
- 주문이 없는 사용자도 모두 포함되어야 하며, 이 경우 주문 횟수는 0으로 표시되어야 합니다.
즉, Users 테이블을 기준으로 LEFT JOIN하여 모든 사용자가 결과에 포함되도록 해야 합니다.
📊 테이블 구조
Users 테이블
Column Name | Type |
user_id | int |
join_date | date |
favorite_brand | varchar |
Orders 테이블
Column Name | Type |
order_id | int |
order_date | date |
item_id | int |
buyer_id | int |
seller_id | int |
Items 테이블
Column Name | Type |
item_id | int |
item_brand | varchar |
💡 SQL 문제 해결 방법
- Users 테이블을 기준으로 모든 사용자를 가져와야 하므로 LEFT JOIN 사용
- 조인 조건에 **AND year(order_date) = '2019'**를 추가해 2019년 주문만 포함
- COUNT(b.order_date)를 통해 사용자별 2019년 주문 수 계산
- GROUP BY를 이용해 user_id 단위로 묶기
728x90
🖥️ SQL 풀이
SELECT a.user_id AS buyer_id
, a.join_date
, COUNT(b.order_date) AS orders_in_2019
FROM Users a
LEFT JOIN Orders b
ON a.user_id = b.buyer_id
AND YEAR(b.order_date) = '2019'
GROUP BY a.user_id;
🔍 쿼리 분석
- LEFT JOIN: 모든 사용자 정보를 기준으로 조인하여 주문이 없는 사용자도 포함
- AND YEAR(b.order_date) = '2019': 2019년에 발생한 주문만 필터링
- COUNT(b.order_date): 주문 수를 집계 (없으면 0으로 나옴)
- GROUP BY a.user_id: 사용자별로 결과 그룹화
📌 실행 예제
📊 입력 데이터
Users 테이블
user_id | join_date | favorite_brand |
1 | 2018-01-01 | Lenovo |
2 | 2018-02-09 | Samsung |
3 | 2018-01-19 | LG |
4 | 2018-05-21 | HP |
Orders 테이블
order_id | order_date | item_id | buyer_id | seller_id |
1 | 2019-08-01 | 4 | 1 | 2 |
2 | 2018-08-02 | 2 | 1 | 3 |
3 | 2019-08-03 | 3 | 2 | 3 |
4 | 2018-08-04 | 1 | 4 | 2 |
5 | 2018-08-04 | 1 | 3 | 4 |
6 | 2019-08-05 | 2 | 2 | 4 |
Items 테이블
item_id | item_brand |
1 | Samsung |
2 | Lenovo |
3 | LG |
4 | HP |
쿼리 실행 결과
buyer_id | join_date | orders_in_2019 |
1 | 2018-01-01 | 1 |
2 | 2018-02-09 | 2 |
3 | 2018-01-19 | 0 |
4 | 2018-05-21 | 0 |
- 사용자 1은 2019년에 1번 주문
- 사용자 2는 2019년에 2번 주문
- 사용자 3, 4은 2019년에 주문한 내역 없음 → 0으로 표시
🎯 결론
이 문제는 LEFT JOIN과 조건부 COUNT를 동시에 활용하는 연습 문제입니다.
특정 연도나 조건에 맞춰 집계할 때 JOIN 조건 안에 AND를 넣는 방식은 실무에서도 매우 자주 사용됩니다.
특히, 모든 사용자를 포함하면서도 특정 조건에 맞는 주문 수만 세기 때문에
JOIN과 필터 조건을 구분해서 쓸 줄 아는 것이 중요합니다. 😊
더 많은 SQL 문제 풀이를 보고 싶다면 LeetCode SQL 문제 모음을 확인해 보세요! 🚀
728x90
반응형
'LeetCode' 카테고리의 다른 글
[LeetCode] 262. Trips and Users (2) | 2025.04.18 |
---|---|
[LeetCode] 1393. Capital Gain/Loss (0) | 2025.04.17 |
[LeetCode] 608. Tree Node (0) | 2025.04.16 |
[LeetCode] 184. Department Highest Salary (0) | 2025.03.26 |
[LeetCode] 178. Rank Scores (0) | 2025.03.20 |