프로그래머스; 오프라인/온라인 판매 데이터 통합하기

랜디 Randy·2024년 1월 4일
0

SQL 문제풀이

목록 보기
8/20

  1. ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 판매 날짜, 상품ID, 유저ID, 판매량 SELECT
    • 2022년 3월의 데이터만 선택
  2. OFFLINE_SALE의 유저ID는 NULL로 처리
  3. 판매일 오름차순, 상품ID 오름차순, 유저ID 오름차순으로 정렬

코드

-- answer
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
        PRODUCT_ID,
        USER_ID,
        SALES_AMOUNT
FROM 
((SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
 FROM ONLINE_SALE
 WHERE SALES_DATE LIKE '2022-03%')
 
UNION ALL
 
(SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE LIKE '2022-03%')) AS SALES

ORDER BY SALES.SALES_DATE, SALES.PRODUCT_ID, SALES.USER_ID;

NULL AS

OFFLINE_SALES 테이블에는 USER_ID 값이 없습니다.
UNION ALL을 하려면 칼럼명이 동일해야하는데, USER_ID 칼럼은 만들어야겠고 만들어진 값은 없고 하니 NULL로 값을 채우라는 조건이 붙었습니다.

UNION ALL

두 테이블을 열 방향으로 결합합니다. UNION의 경우 중복되는 행은 제거하고, UNION ALL은 중복되더라도 제거하지 않고 결합합니다.
여기선 OFFLINE_SALE의 USER_ID를 모두 NULL로 처리했기 때문에 중복되는 행은 없을겁니다.

LIKE

2022년 3월에 해당하는 판매날짜 중에서 SELECT 해야합니다.

이전 포스팅 에서는 특정 날짜를

BOARD.CREATED_DATE BETWEEN '2022-10-01'
						AND '2022-10-31'

와 같은 코드를 작성해서 해결하였으나,
이번에는

SALES_DATE LIKE '2022-03%'

와 같은 코드로
2022-03 만 적혀있다면 뒤에는 어떤게 적혀있어도 선택되는 코드를 선택했습니다.
코드 자체는 좀 더 단순하지만, 2022-03-00과 같은 데이터의 에러는 이 과정에서 거르지 못한다는 문제가 있습니다.

profile
데이터는 계단, 직관은 다리

0개의 댓글