SQL 기초 - 3 (DATE_FORMAT, UNION ALL 사용법)

박건우·2023년 10월 26일
1

SQL

목록 보기
4/7

> 클릭하여 문제 풀어보기

주어진 문제는 다음과 같다.


이 문제는 생각보다 시간이 오래 걸렸다.
우선 처음에 쓴 답은 다음과 같았다.

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 순으로 정렬.

UNION ALL 사용법

SELECT 합칠 컬럼명1, 합칠 컬렴명2... FROM 테이블 이름
UNION ALL
SELECT 합칠 컬럼명1, 합칠 컬렴명2... FROM 테이블 이름;

0개의 댓글