본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] Leet code - Market Analysis I

by kime2 2024. 8. 2.
출처

 

문제

각 사용자, 가입 날짜 및 2019년 구매자로서 한 주문 수를 찾을 수 있는 솔루션을 작성하십시오.
순서에 관계없이 결과 테이블을 반환합니다.

문제에 대한 해석

 

가입한 모든 유저의 가입날짜와 2019년 구매건수에 대해 출력

풀이(MYSQL)

 오답

select o.buyer_id, u.join_date, count(o.order_id) as 'orders_in_2019 '
from Users u join Orders o
on u.user_id = o.buyer_id
where year(o.order_date) = 2019
group by  o.buyer_id, u.join_date

where절로 필터링 하면 2019년에 구매 경험이 없는 사람들의 id는 출력되지 않는다

 

정답

-- 방법1
select u.user_id as 'buyer_id', u.join_date,
sum(case when year(o.order_date) = 2019 then 1 else 0 end) as 'orders_in_2019'
from Users u left join Orders o
on u.user_id = o.buyer_id
group by 1,2
order by 1

 모든 고객의 id를 조회하기 위해 Users테이블에 left조인을 하고

주문날짜의 연도가 2019년이면 1로하여 주문건수를 합산한다

 

-- 방법2
SELECT u.user_id as buyer_id, u.join_date , count(o.order_id) as 'orders_in_2019'
FROM users u
LEFT JOIN Orders o
ON o.buyer_id=u.user_id AND YEAR(order_date)='2019'
GROUP BY u.user_id

 users테이블을 기준으로 left조인한 것까지는 동일하나

조인 조건에 orders에 있는 order_date의 연도가 2019년인 테이터만 조인하였다

아래와 같이 2019년 주문이 없을 경우null로 나온다