주어진 문제는 다음과 같다.
이 문제는 생각보다 시간이 오래 걸렸다.
우선 처음에 쓴 답은 다음과 같았다.
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM (
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE YEAR(SALES_DATE) = 2022 AND MONTH(SALES_DATE) = 3
UNION ALL
SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE YEAR(SALES_DATE) = 2022 AND MONTH(SALES_DATE) = 3
) AS join_table
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
결과는 제대로 출력되고, 원하는 답까지 나왔다.
그런데 틀렸다. 왜 틀렸는지 다른 정답자와 비교하고 찾는 시간이 꽤 걸렸다.
틀린 부분을 찾고나니 너무 간단했다. date의 형식에 문제가 있었다.
DATE_FORMAT을 사용하여 설정하지 않으면, 기본값이 2022-03-01 10:15:30와 같이 연-월-일 시:분:초 형식으로 날짜와 시간이 표기된다. 문제에서 요구하는 정답은 연-월-일 까지의 값이었고, 나는 시:분:초까지 구한 게 오답 사유였다.
수정된 정답은 다음과 같다.
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 YEAR(SALES_DATE) = 2022 AND MONTH(SALES_DATE) = 3
UNION ALL
SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE YEAR(SALES_DATE) = 2022 AND MONTH(SALES_DATE) = 3
) AS join_table
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
DATE_FORMAT(SALES_DATE, '%Y-%m-%d')으로 형식 설정 한 것 말고 달라진 게 없다.
고치니까 바로 정답이었다.
한 줄씩 해석하면 다음과 같다.
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
// SALES_DATE 의 형식을 연-월-일로 정의.
PRODUCT_ID, USER_ID, SALES_AMOUNT
// SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT 를 구함.
FROM (
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
// ONLINE_SALE 테이블에서 SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT 를 구함
WHERE YEAR(SALES_DATE) = 2022 AND MONTH(SALES_DATE) = 3
// 조건은 SALES_DATE가 2022년, 3월.
UNION ALL
// ONLINE_SALE, OFFLINE_SALE 두 테이블을 합침.
SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
// OFFLINE_SALE 테이블에서 SELECT SALES_DATE, PRODUCT_ID, USER_ID(USER_ID 대신 NULL 값), SALES_AMOUNT 를 구함
WHERE YEAR(SALES_DATE) = 2022 AND MONTH(SALES_DATE) = 3
// 조건은 SALES_DATE가 2022년, 3월.
) AS join_table
// 합친 테이블을 join_table 이라고 지정. join_table은 다른 이름으로 써도 상관없음.
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
// 결과를 SALES_DATE 순으로 정렬, 같으면 PRODUCT_ID 순으로 정렬, 같으면 USER_ID 순으로 정렬.
SELECT 합칠 컬럼명1, 합칠 컬렴명2... FROM 테이블 이름
UNION ALL
SELECT 합칠 컬럼명1, 합칠 컬렴명2... FROM 테이블 이름;