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

[문제 링크]

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


문제

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

해답

SELECT TO_CHAR(SALES_DATE, 'YYYY-MM-DD') "SALES_DATE" --날짜 포맷을 지정해줍니다
    , PRODUCT_ID
    , USER_ID
    , SALES_AMOUNT
FROM ONLINE_SALE 
WHERE TO_CHAR(SALES_DATE, 'YYYY-MM') = '2022-03'

UNION ALL --두 SELECT문의 조회 결과를 중복을 제거하지 않고 합집합 연산을 진행합니다.

SELECT TO_CHAR(SALES_DATE, 'YYYY-MM-DD') "SALES_DATE"
    , PRODUCT_ID
    , NULL "USER_ID" --오프라인 판매는 유저ID를 NULL로 표시하라고 했으니 컬럼의 값을 NULL로 설정하고 컬럼 명 "USER_ID"로 설정합니다.
    , SALES_AMOUNT
FROM OFFLINE_SALE
WHERE TO_CHAR(SALES_DATE, 'YYYY-MM') = '2022-03'

ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

사실 해당 문제에서 UNION을 사용하든, UNION ALL을 사용하든 정답에는 문제가 없다.

 

어째서?

'온라인' '오프라인'으로 중복이 있을 수 없는 엔티티(테이블)이기 때문에 어떠한 것을 사용해도 결과에 지장은 없는 것이다.


관련 개념

 

[SQL]UNION, UNION ALL 차이

UNION 란? 간단하게, 두 테이블의 '합집합'을 조회하는 것이다. 언제 사용하는가? 두 엔티티(테이블)가 하나의 엔티티(테이블)로 통합되어야 할 경우에 사용한다. 가장 연습될만한 예제를 첨부할테

jsum01.tistory.com

 

[SQL]MySQL Oracle_SQL의 날짜 포맷

MySQL - DATE_FORMAT(Column, 'DATE FORMAT') 구분 기호 상세 기호 역할 년 %Y 년도 - 4자리 (2021, 2019, 2059, ...) %y 년도 - 2자리 (21, 19, 59 , ...) 월 %M 긴 월(영문) %b 짧은 월(영문) %m 숫자 월 - 2자리 (01, 02, 03, ... , 12)

jsum01.tistory.com