ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서
2022년 3월의
오프라인/온라인 상품 판매 데이터의
판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요.
OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요.
결과는 판매일을 기준으로 오름차순 정렬해주시고
판매일이 같다면 상품 ID를 기준으로 오름차순,
상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.
SELECT *
FROM (SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE YEAR(SALES_DATE)=2022 AND MONTH(SALES_DATE)=3
UNION ALL
SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE YEAR(SALES_DATE)=2022 AND MONTH(SALES_DATE)=3) AS SALE
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
Join이 아니라 테이블의 합집합을 이용해서 테이블을 합치는 문제였다.
테이블의 합집합은 UNION, UNION ALL로 구할 수 있다.
두 번째로 고민했던 점은 OFFLINE_SALE 테이블에는 USER_ID 컬럼이 존재하지 않는다는 것이었는데, 테이블 자체를 ALTER 구문으로 바꿔야 하나 했지만 바뀌지 않았다.
이후에 그냥 NULL을 SELECT 절에 넣으면 된다는 것을 알게 되었다.
SELECT NULL AS USER_ID
FROM OFFLINE_SALE
Join으로만 해결하려다 보니 GROUP BY를 써야 하나, 서브 쿼리를 이용해야 하나 하고 머리가 복잡해졌었다. 문제의 '오프라인/온라인 상품 판매 데이터의 판매량을 출력하라'는 조건을 보고 오프라인 상품 판매량과 온라인 상품 판매량의 수량을 합쳐야 하는 줄 알고 해맸던 것도 컸다.