문제풀이/프로그래머스

[MYSQL/Lv4] 오프라인/온라인 판매 데이터 통합하기

bbugi 2023. 8. 30. 16:21

https://school.programmers.co.kr/learn/courses/30/lessons/131537

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


MySQL - LV4

UNION 사용

 

1. 두 개의 테이블을 합친 뒤 조건에 맞는 데이터를 SELECT 하는 문제

JOIN을 많이 사용하다보니 단순하게 테이블을 합친다는 개념으로만 접근해

UNION이 아닌 JOIN을 먼저 떠올리는 경우가 있으니 조심.

 

    - UNION : 테이블을 ROW로 합치기

    - JOIN : 테이블을 COLUMN으로 합치기

 

2. UNION을 사용할 때는 두 테이블의 컬럼데이터 형식이 동일해야 하는데,

문제에서 주어진 테이블 중 OFFLINE_SALE 에는 USER_ID 컬럼이 존재하지 않아 추가해주어야 한다.

문제에서도 OFFLINE_SALE 테이블의 USER_ID 값은 NULL 로 표시해주라고 나와있다.

 

테이블에 임시 컬럼을 추가하는 방법은 SELECT 문을 활용하여 사용할 수 있다.

    SELECT '컬럼에 들어갈 값' AS 컬럼명 

문제에서 NULL값으로 지정해주라고 되어있어 'NULL' 로 입력하다보니 NULL 그 자체의 값이 아니라 문자 'NULL'로 인식되어 틀렸다고 나왔다. 문제에서 요구한 것은 문자 'NULL'이 아닌 NULL 그 자체의 값이므로 SELECT 문에서 

    SELECT NULL AS USER_ID

를 입력해주니 통과가 되었다.

 

3. 문제의 정답 여부와는 상관이 없지만 UNION / UNION ALL 의 차이

    - UNION의 경우 합치는 테이블의 중복값을 제거한다. → 따라서 정렬을 발생 시킨다.

    - UNION ALL 의 경우 합치는 테이블의 중복값을 제거하지 않고 모든 데이터를 합친다. → 정렬을 발생시키지 않는다.

 


[정답 코드]

SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE

-- 3월의 데이터만 가져와야 하는 상황에서 사용할 수 있는 조건문 작성방식 2가지
-- WHERE SALES_DATE >= '2022-03-01' AND SALES_DATE < '2022-04-01'
WHERE MONTH(SALES_DATE) = 3

UNION ALL 
-- UNION 은 두 테이블 사이의 중복값을 제거하여 정렬이 일어나고, 
-- 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 SALES_DATE >= '2022-03-01' AND SALES_DATE < '2022-04-01'
WHERE MONTH(SALES_DATE) = 3

ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC