IT/SQL

[MySQL] 프로그래머스 - 오프라인/온라인 판매 데이터 통합하기

무지개는 환상 2024. 1. 29. 09:32

<ONLINE_SALE> & <OFFLINE_SALE> 테이블 구조

ONLINE_SALE 테이블
OFFLINE_SALE 테이블

 

<문제>

 

 

 

<문제 풀이>

SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
    PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE YEAR(SALES_DATE) = '2022' AND MONTH(SALES_DATE) = '3'

UNION ALL

SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
    PRODUCT_ID,
    NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE YEAR(SALES_DATE) = '2022' AND MONTH(SALES_DATE) = '3'

ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC;

 

기존 문제들이 가로병합 개념으로 생각하는 JOIN함수를 메인으로 문제가 나왔다면 이번 문제는 반대로 세로병합을 위한 UNION 함수를 이용하는 문제였다!

 

우선은 ONLINE 테이블의 컬럼 갯수가 더 많기 때문에 먼저 문제의 요구에 맞게 ONLINE 테이블을 작성하였다.

그 후 OFFLINE 테이블 작성 후 OFFLINE 에 없는 USER_ID 컬럼을 만들어 줘야한다. 해당 컬럼을 그냥 NULL값으로 만들면 된다.

 

그 다음 위에서 만든 2개의 테이블을 UNION ALL 함수를 이용해 연결하여 주고, ORDER절을 요구사항에 맞게 작성하였다.

 

* UNION 함수 : 중복된 값을 제거하고 쿼리의 결과를 합치는 함수

* UNION ALL 함수 : 중복된 값을 제거하지 않고 쿼리의 결과를 합치는 함수

 

출처 : 프로그래머스 - 오프라인/온라인 판매 데이터 통합하기