프로그래머스 Lv 4 - 오프라인/온라인 판매 데이터 통합하기
링크: https://school.programmers.co.kr/learn/courses/30/lessons/131537
습득한 점:
* 컬럼의 값을 NULL 로 표시해야 할 경우에는, 문자열 "NULL" 나타내는 것이 아닌 NULL 로만 기재
* UNION , UNION ALL?
- UNION은 두 개의 테이블을 하나로 만드는 연산.
두 개 테이블의 컬럼 수, 컬럼 데이터 형식이 모두 일치해야 함.
UNION 연산은 두 개의 테이블을 하나로 합치면서 중복된 데이터를 제거한다. 정렬을 발생
- UNION ALL은 중복을 제거하거나 정렬을 유발하지 않는다. 중복제거 없이 전부 보여줌
두 개 테이블의 컬럼 수가 같아야 하는 것은 동일
- Reference
https://prinha.tistory.com/entry/MySQL-COALESCE-%ED%95%A8%EC%88%98
https://whitepro.tistory.com/580
https://gooreumwave.tistory.com/25
문제:
ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서
2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력
OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시
판매일을 기준으로 오름차순 정렬,
판매일이 같다면 상품 ID를 기준으로 오름차순,
상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬
문제 파악:
두개 테이블을 합쳐서, 날짜에 맞는 조건들만 건져내면 된다.
날짜만 포맷을 바꿔서 바꿔주면 되었음.
아래와 같이 NULL 값 표기가 필요할 때는,
문자열 "NULL" 나타내는 것이 아닌 NULL 로만 기재하는 것만 유의하면 쉽게 풀 수 있는 문제
* 아래처럼 With 구문을 쓰지 않고 테이블 2개를 한번에 묶고, 정렬해줘도 풀 수 있을 것 같다.
(SELECT *
FROM TABLE_1
UNION
SELECT *
FROM TABLE_2)
ORDER BY ~~~
풀이:
WITH COUNTER AS (
SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE
, PRODUCT_ID
, USER_ID
, SALES_AMOUNT
FROM ONLINE_SALE AS ONSALE
UNION ALL
SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE
, PRODUCT_ID
, NULL AS USER_ID
, SALES_AMOUNT
FROM OFFLINE_SALE AS OFFSALE
)
SELECT *
FROM COUNTER
WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE,PRODUCT_ID,USER_ID