프로그래머스 Lv4. 오프라인/온라인 판매 데이터 통합하기

2023. 8. 16. 15:30SQL/SQL 테스트 연습

 

문제 설명

 

다음은 어느 의류 쇼핑몰의 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블과 오프라인 상품 판매 정보를 담은 OFFLINE_SALE 테이블입니다. ONLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 ONLINE_SALE_ID, USER_ID,  PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.

 

Column name Type Nullable
ONLINE_SALE_ID INTEGER FALSE
USER_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

 

동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다. OFFLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 OFFLINE_SALE_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 오프라인 상품 판매 ID, 상품 ID, 판매량, 판매일을 나타냅니다.

 

Column name Type Nullable
OFFLINE_SALE_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

 

동일한 날짜, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.

 

ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저 ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL로 표시해 주세요. 결과는 판매일을 기준으로 오름차순 정렬해 주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품 ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해 주세요.

 

문제 풀이
SELECT 
    DATE_FORMAT(SALES_DATE, '%Y-%m-%d') SALES_DATE, 
    PRODUCT_ID, 
    USER_ID, 
    SALES_AMOUNT
FROM 
    (
        SELECT 
            SALES_DATE, 
            PRODUCT_ID, 
            USER_ID, 
            SALES_AMOUNT
        FROM 
            ONLINE_SALE
        WHERE 
            SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31'
        UNION ALL
        SELECT 
            SALES_DATE, 
            PRODUCT_ID, 
            NULL AS USER_ID, 
            SALES_AMOUNT
        FROM 
            OFFLINE_SALE
        WHERE 
            SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31'
    ) AS SALE
ORDER BY 
    SALES_DATE ASC, 
    PRODUCT_ID ASC, 
    USER_ID ASC;
  • 서브쿼리 (Subquery) 내에서 두 개의 SELECT 문을 UNION ALL로 결합:
    • 첫 번째 SELECT 문은 ONLINE_SALE 테이블에서 정보를 가져옵니다. 여기서는 2022년 3월 1일부터 2022년 3월 31일까지의 판매 정보만 필터링하여 가져옵니다.
    • 두 번째 SELECT 문은 OFFLINE_SALE 테이블에서 정보를 가져옵니다. 이때, USER_ID는 오프라인 판매에서는 사용되지 않으므로 NULL로 표시됩니다. 이 SELECT문도 첫 번째 SELECT 문과 동일하게 2022년 3월 1일부터 2022년 3월 31일까지의 판매 정보만 필터링하여 가져옵니다.
    • UNION ALL은 두 쿼리의 결과를 모두 합쳐줍니다. (UNION은 중복을 제거하지만, UNION ALL은 중복을 제거하지 않습니다.)
  • 서브쿼리의 결과를 바탕으로 외부 쿼리 실행:
    • DATE_FORMAT 함수를 사용하여 SALES_DATE의 형식을 'YYYY-MM-DD' 형식으로 변환합니다.
    • PRODUCT_ID, USER_ID, SALES_AMOUNT도 함께 선택됩니다.
  • 최종 결과 정렬:
    • 결과는 먼저 SALES_DATE 기준으로 오름차순 정렬됩니다.
    • SALES_DATE가 동일한 경우, PRODUCT_ID로 오름차순 정렬됩니다.
    • 그리고 PRODUCT_ID가 동일한 경우, USER_ID로 오름차순 정렬됩니다.