https://school.programmers.co.kr/learn/courses/30/lessons/131537
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 활용
'Algorithm > Programmars' 카테고리의 다른 글
[SQL] 즐겨찾기가 가장 많은 식당 정보 출력하기 - 프로그래머스[Lv.3] (1) | 2024.01.27 |
---|---|
[JAVA] 입국심사 - 프로그래머스[Lv.3] (0) | 2024.01.25 |
[SQL] 재구매가 일어난 상품과 회원 리스트 구하기- 프로그래머스[Lv.2] (1) | 2024.01.23 |
[SQL] 조건에 맞는 도서 리스트 출력하기 - 프로그래머스[Lv.1] (0) | 2024.01.21 |
[JAVA] 퍼즐 조각 채우기 - 프로그래머스[Lv.3] (0) | 2024.01.17 |