SELECT 오프라인/온라인 판매 데이터 통합

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

문제 설명

다음은 어떤 의류 쇼핑몰의 온라인 상품 판매 정보가 포함되어 있습니다. ONLINE_SALE 테이블 및 오프라인 상품 판매 정보 포함 OFFLINE_SALE 테이블입니다. ONLINE_SALE 테이블은 다음과 같은 구조로 되어 있습니다. ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량 및 판매일을 나타냅니다.

Column nameTypeNullable

ONLINE_SALE_ID INTEGER 거짓
USER_ID INTEGER 거짓
PRODUCT_ID INTEGER 거짓
SALES_AMOUNT INTEGER 거짓
SALES_DATE DATE 거짓

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

OFFLINE_SALE 테이블은 다음과 같은 구조로 되어 있습니다. OFFLINE_SALE_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 오프라인 상품 판매 ID, 상품 ID, 판매량 및 판매일을 나타냅니다.

Column nameTypeNullable

OFFLINE_SALE_ID INTEGER 거짓
PRODUCT_ID INTEGER 거짓
SALES_AMOUNT INTEGER 거짓
SALES_DATE DATE 거짓

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


문제

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


예를 들면 ONLINE_SALE 테이블은 다음과 같습니다.

ONLINE_SALE_IDUSER_IDPRODUCT_IDSALES_AMOUNTSALES_DATE

1 1 3 2 2022-02-25
2 4 4 1 2022-03-01
4 2 2 2 2022-03-02
3 6 3 3 2022-03-02
5 5 5 1 2022-03-03
6 5 7 1 2022-04-06

OFFLINE_SALE 테이블이 다음과 같은 경우

OFFLINE_SALE_IDPRODUCT_IDSALES_AMOUNTSALES_DATE

1 1 2 2022-02-21
4 1 2 2022-03-01
3 3 3 2022-03-01
2 4 1 2022-03-01
5 2 1 2022-03-03
6 2 1 2022-04-01

각 테이블의 2022년 3월 판매 데이터를 정렬하여 정렬한 결과는 다음과 같습니다.

SALES_DATEPRODUCT_IDUSER_IDSALES_AMOUNT

2022-03-01 1 NULL 2
2022-03-01 3 NULL 3
2022-03-01 4 NULL 1
2022-03-01 4 4 1
2022-03-02 2 2 2
2022-03-02 3 6 3
2022-03-03 2 NULL 1
2022-03-03 5 5 1

내 잔디

SELECT DATE_FORMAT(SALES_DATE,"%Y-%m-%d") 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") SALES_DATE,
    PRODUCT_ID,
    NULL AS USER_ID,
    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

처음에는 JOIN을 사용하여 테이블을 맞추면 좋다고 생각했습니다.

UNION을 사용하여 해결하는 문제였습니다.

https://monawa.tistory.com/103

(MY SQL) JOIN과 UNION

JOIN JOIN은 두 테이블을 함께 데이터를 수집하는 방법입니다.링크하려면 테이블이 하나 이상의 열을 공유해야 합니다. INNER JOIN(내부 조인) 두 테이블을 조인할 때

monawa.tistory.com

주의해야 할 점은 OFFLINE_SALE 테이블의 USER_ID를 NULL로 취급해야합니다!