코딩테스트/SQL

[프로그래머스][MySQL] Lv. 4 오프라인/온라인 판매 데이터 통합하기

_알파카 2025. 6. 23. 17:52
728x90

문제 설명

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이 비슷하다고 생각할 수 있는데, 

JOIN

 

UNION

위의 이미지와 같이 UNION은 수직결합(세로), 

JOIN은 수평결합(가로)

로 이해하고 있으면 쉽다. 

728x90