[프로그래머스][MySQL] Lv. 4 오프라인/온라인 판매 데이터 통합하기
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/131537
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
내 풀이 (정답)
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE SALES_DATE LIKE '2022-03%'
UNION ALL
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID
-- offline 테이블에는 user 컬럼이 없음
, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE LIKE '2022-03%'
-- 정렬 조건
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
데이터는 온라인 판매 데이터와 오프라인 판매 데이터, 2개의 테이블로 주어진다.
이를 각각 따로 구하고, UNION을 통해 합쳐주면 되는 문제이다.
다만, 실제로 테이블을 출력해보면..
오프라인 판매 테이블에는 2022-03 판매 내역이 없다.
이 때문에 조금 헷갈리긴 했지만 어렵지 않게 풀 수 있었다.
새로운 컬럼 NULL로 생성하기
또한 주의해야할 점은,
OFFLINE_SALE 테이블에 USER_ID 컬럼이 아예 없다는 점이다.
따라서
NULL AS USER_ID
NULL AS (컬럼명) 구문을 사용하여 새로운 컬럼을 만들어줘야한다.
왜냐하면, UNION을 사용할 때는 두 SELECT 구문이 반환하는 컬럼 수와 컬럼 순서, 타입이 일치해야 하기 때문이다!
UNION VS UNION ALL
UNION
UNION은 여러 개의 SELECT 문의 결과를 하나의 결과로 연결할 때 사용한다.
이때, 중복되는 행은 하나만 표시하게 된다.
주의할 점은 UNION에서 반환하는 구문들의 컬럼 수, 컬럼 순서, 타입이 모두 일치해야 한다.
UNION ALL
UNION ALL 역시 두 SQL 문의 결과를 결합하는데 사용되는 명령문이지만,
UNION ALL은 데이터 값이 중복되더라도 모두 표시한다.
즉, 중복을 제거하지 않고 중복되는 여러 레코드를 모두 출력하는 것이다.
UNION과 JOIN의 차이
UNION과 JOIN이 비슷하다고 생각할 수 있는데,
위의 이미지와 같이 UNION은 수직결합(세로),
JOIN은 수평결합(가로)
로 이해하고 있으면 쉽다.