관리 메뉴

오늘도 배운다

1158. Market Analysis I / LeetCode, SQL, MySQL 본문

코딩테스트연습(SQL)

1158. Market Analysis I / LeetCode, SQL, MySQL

LearnerToRunner 2023. 3. 6. 20:47

문제

source: LeetCode
Write an SQL query 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.

 

 

 

 

제출답안(MySQL)

WITH buyer_2019 
    AS(
        SELECT buyer_id, COUNT(order_id) AS orders_in_2019
        FROM orders
        WHERE YEAR(order_date) = 2019
        GROUP BY buyer_id
    )

SELECT 
    user_id AS buyer_id, 
    join_date, 
    CASE WHEN user_id IN (SELECT buyer_id FROM buyer_2019) 
        THEN orders_in_2019
        ELSE 0
    END AS orders_in_2019 
FROM users AS u
    LEFT JOIN buyer_2019 AS b
    ON b.buyer_id = u.user_id

 

 

 

풀이(MySQL)

더보기

목표: 2019년 주문하지 않은 사람의 수를 0으로 표기해야함

 

2019년 오더한 사람들과 오더 수를 담은 CTE 생

WITH buyer_2019 
    AS(
        SELECT buyer_id, COUNT(order_id) AS orders_in_2019
        FROM orders
        WHERE YEAR(order_date) = 2019
        GROUP BY buyer_id
    )

>> buyer_2019 는  2019년 오더한 사람의 id와 주문 횟수를 보여줌

 

users와 buyer_2019를 조인

SELECT 
    user_id AS buyer_id, 
    join_date, 
    CASE WHEN user_id IN (SELECT buyer_id FROM buyer_2019) 
        THEN orders_in_2019
        ELSE 0
    END AS orders_in_2019 
FROM users AS u
    LEFT JOIN buyer_2019 AS b
    ON b.buyer_id = u.user_id

>> 주문한 사람을 보여주기 위해서는 buyer_2019의 buyer_id가 아니라 전체 유저의 id를 보여줘야함. 따라서 user_id를 SELECT하고 이름만 바꾸어 주었음

>>  주문횟수의 경우, 2019년에 있으면 buyer_2019의 오더주문을 쓰고 없을경우 0을 반환하게 CASE WHEN 사용

(user_id가 buyer_2019의 buyer_id에 속한다면 orders_in_2019값 활용, 없을 경우 0 반)

 

 

 

문제 바로가기(MySQL)

 

728x90
Comments