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

sammy·2024년 6월 14일

SQL 문제풀이

목록 보기
12/87

문제

문제 설명

다음은 어느 의류 쇼핑몰의 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블과 오프라인 상품 판매 정보를 담은 OFFLINE_SALE 테이블 입니다. ONLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.

Column nameTypeNullable
ONLINE_SALE_IDINTEGERFALSE
USER_IDINTEGERFALSE
PRODUCT_IDINTEGERFALSE
SALES_AMOUNTINTEGERFALSE
SALES_DATEDATEFALSE

동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.

OFFLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 OFFLINE_SALE_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 오프라인 상품 판매 ID, 상품 ID, 판매량, 판매일을 나타냅니다.

Column nameTypeNullable
OFFLINE_SALE_IDINTEGERFALSE
PRODUCT_IDINTEGERFALSE
SALES_AMOUNTINTEGERFALSE
SALES_DATEDATEFALSE

동일한 날짜, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.

문제

ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.

예시

예를 들어 ONLINE_SALE 테이블이 다음과 같고

ONLINE_SALE_IDUSER_IDPRODUCT_IDSALES_AMOUNTSALES_DATE
11322022-02-25
24412022-03-01
42222022-03-02
36332022-03-02
55512022-03-03
65712022-04-06

OFFLINE_SALE 테이블이 다음과 같다면

OFFLINE_SALE_IDPRODUCT_IDSALES_AMOUNTSALES_DATE
1122022-02-21
4122022-03-01
3332022-03-01
2412022-03-01
5212022-03-03
6212022-04-01

각 테이블의 2022년 3월의 판매 데이터를 합쳐서, 정렬한 결과는 다음과 같아야 합니다.

SALES_DATEPRODUCT_IDUSER_IDSALES_AMOUNT
2022-03-011NULL2
2022-03-013NULL3
2022-03-014NULL1
2022-03-01441
2022-03-02222
2022-03-02363
2022-03-032NULL1
2022-03-03551

문제접근

  1. ONLINE/OFFLINE 별 쿼리를 작성한다.
  2. UNION ALL을 사용하여 결과를 합친다.

내 정답

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

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 DATE_FORMAT(SALES_DATE,'%Y-%m')='2022-03'

ORDER BY SALES_DATE ASC,PRODUCT_ID ASC,USER_ID ASC;

짚고 넘어가기

UNION과 UNION ALL

UNIONUNION ALL은 SQL에서 사용되는 두 가지 연산자로, 여러 SELECT 문의 결과 집합을 결합하는 데 사용됩니다. 각각의 차이점과 어떻게 사용하는지에 대해 알아보겠습니다.

UNION

UNION 연산자는 두 개 이상의 SELECT 문의 결과 집합을 하나의 결과 집합으로 합칩니다. 이 때, 중복된 행은 하나로 처리됩니다. 기본적으로 UNION은 중복 행을 제거하므로, 동일한 결과가 여러 SELECT 문에서 반환될 경우 중복을 제거하고 최종 결과에 하나만 포함시킵니다.

SELECT column1, column2
FROM table1
WHERE condition

UNION

SELECT column1, column2
FROM table2
WHERE condition;

UNION ALL

UNION ALL 연산자는 UNION과 달리 중복 행을 제거하지 않고 모든 SELECT 문의 결과를 그대로 합칩니다. 따라서 중복된 행이 여러 SELECT 문에서 반환될 경우, 그대로 모든 중복 행을 포함한 최종 결과 집합이 만들어집니다.

SELECT column1, column2
FROM table1
WHERE condition

UNION ALL

SELECT column1, column2
FROM table2
WHERE condition;

주요 차이점 정리

  • 중복 행 처리: UNION은 중복 행을 제거하고 하나의 결과 집합에 포함시키지만, UNION ALL은 중복을 제거하지 않고 모든 결과를 합칩니다.
  • 성능: UNION은 중복 제거를 위해 추가적인 비용이 발생할 수 있기 때문에 UNION ALLUNION보다 성능이 더 좋을 수 있습니다.
profile
누군가에게 도움을 주기 위한 개발자로 성장하고 싶습니다.

0개의 댓글