-- 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;
OFFLINE_SALES 테이블에는 USER_ID 값이 없습니다.
UNION ALL을 하려면 칼럼명이 동일해야하는데, USER_ID 칼럼은 만들어야겠고 만들어진 값은 없고 하니 NULL로 값을 채우라는 조건이 붙었습니다.
두 테이블을 열 방향으로 결합합니다. UNION
의 경우 중복되는 행은 제거하고, UNION ALL
은 중복되더라도 제거하지 않고 결합합니다.
여기선 OFFLINE_SALE의 USER_ID를 모두 NULL로 처리했기 때문에 중복되는 행은 없을겁니다.
2022년 3월에 해당하는 판매날짜 중에서 SELECT 해야합니다.
이전 포스팅 에서는 특정 날짜를
BOARD.CREATED_DATE BETWEEN '2022-10-01'
AND '2022-10-31'
와 같은 코드를 작성해서 해결하였으나,
이번에는
SALES_DATE LIKE '2022-03%'
와 같은 코드로
2022-03 만 적혀있다면 뒤에는 어떤게 적혀있어도 선택되는 코드를 선택했습니다.
코드 자체는 좀 더 단순하지만, 2022-03-00과 같은 데이터의 에러는 이 과정에서 거르지 못한다는 문제가 있습니다.