최대 1 분 소요

문제 링크

정답

SELECT
    UU.user_id buyer_id,
    UU.join_date,
    CASE
        WHEN T.user_id IS NULL THEN 0
        ELSE T.cnt
    END as 'orders_in_2019'
FROM Users UU
LEFT JOIN (
    SELECT 
        O.buyer_id user_id, 
        COUNT(*) cnt
    FROM Users U
    LEFT JOIN Orders O
    ON U.user_id = O.buyer_id
    WHERE YEAR(O.order_date) = '2019'
    GROUP BY U.user_id
) T
ON UU.user_id = T.user_id

✅ Point

  • WHERE 조건이 먼저 적용되면, 해당 조건을 만족하지 않는 사용자(user)는 아예 집계 대상에서 제외됨
  • 따라서 전체 사용자 목록을 유지한 채로 2019년 주문 건수를 집계하기 위해, 조건이 적용된 주문 집계를 Subquery로 따로 분리하고
  • 그 결과를 LEFT JOIN으로 원본 사용자 테이블과 결합한 후, 주문 내역이 없는 경우 NULL을 0으로 처리하여 표시함