본문 바로가기

[LeetCode] 1158. Market Analysis 1

by qwee0328 2025. 4. 16.

📝 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 문제 해결 방법

  1. Users 테이블을 기준으로 모든 사용자를 가져와야 하므로 LEFT JOIN 사용
  2. 조인 조건에 **AND year(order_date) = '2019'**를 추가해 2019년 주문만 포함
  3. COUNT(b.order_date)를 통해 사용자별 2019년 주문 수 계산
  4. 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