코딩 테스트 연습/[프로그래머스][리트코드] MySQL

[LV.5] SELECT > 오프라인/온라인 판매 데이터 통합하기 ⭐️

duswjd_data 2025. 7. 14. 09:20

문제

https://school.programmers.co.kr/learn/courses/30/lessons/131537

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 설명

  • ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성
  • OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시
  • 결과는 판매일, 상품 ID, 유저 ID 순으로 오름차순 정렬

핵심 정리

이 문제는 두 테이블의 "독립된" 데이터를 "단순히 이어붙이기"를 원함 → JOIN 보다 UNION 이 적절


  • 이 문제는 모든 판매 기록을 합쳐서 보여줘야 하며, 중복이 자연스럽게 존재할 수 있음
  • 예: SALES_DATE, PRODUCT_ID가 같더라도 USER_ID가 다른 경우 존재 → 중복이 아님

UNION ALL 사용


정답 코드

SELECT
    DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
    PRODUCT_ID,
    USER_ID,
    SALES_AMOUNT
FROM ONLINE_SALE
WHERE SALES_DATE >= '2022-03-01' AND SALES_DATE < '2022-04-01'

UNION ALL

SELECT
    DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
    PRODUCT_ID,
    NULL AS USER_ID,  # 오프라인은 회원 정보가 없으므로 USER_ID는 NULL로 고정
    SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE >= '2022-03-01' AND SALES_DATE < '2022-04-01'

ORDER BY
    SALES_DATE,
    PRODUCT_ID,
    USER_ID