Algorithm/Programmars
[SQL] 오프라인/온라인 판매 데이터 통합하기 - 프로그래머스[Lv.4]
mopipi
2024. 1. 24. 14:44
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/131537
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
SELECT DATE_FORMAT(TOTAL.SALES_DATE, '%Y-%m-%d') AS SALES_DATE, TOTAL.PRODUCT_ID, TOTAL.USER_ID, TOTAL.SALES_AMOUNT
FROM (SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
UNION ALL
SELECT SALES_DATE, PRODUCT_ID, NULL, SALES_AMOUNT
FROM OFFLINE_SALE) AS TOTAL
WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
💡 UNION ALL, SELECT - NULL 활용, 서브쿼리
풀이
- SALES_DATE와 PRODUCT 열이 하나로 통합 돼 표시 되어야 함
! 대신 중복되는 것이 겹치면 안되고, 말그대로 테이블을 세로로 붙여서 결과를 뽑아야 함
➡️ 하지만.. 그렇다면 USER_ID는 어떻게 하나?
➡️ 오프라인에도 USER_ID를 만들어 주기 위해 온라인 테이블과 UNION ALL을 해서 합친 테이블을 구현해서 거기서 출력하자
📌 서브쿼리로 합친 테이블을 FROM에 써줄 때도, 별칭을 사용하면 훨씬 직관적이다!
📌 상대편에 없는 열이 존재한다면 SELECT에서 NULL값을 임시로 넣어 출력할 수 있다.
WITH 활용 버전
WITH TOTAL AS
(SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
UNION ALL
SELECT SALES_DATE, PRODUCT_ID, NULL, SALES_AMOUNT
FROM OFFLINE_SALE)
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM TOTAL
WHERE SALES_DATE BETWEEN '2022-03-01 00:00:00' AND '2022-03-31 23:59:59'
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
- WITH 활용해 세로 방향으로 확장한 테이블 먼저 생성하고 사용함
- 사이 기간 설정할 때 LIKE 대신 BETWEEN/AND 활용
반응형