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 활용

 

반응형