본문 바로가기
IT/SQL

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

by 민트린 2023. 9. 27.
728x90

문제

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


풀이

 

Level 4 답게 정말 까다로운 문제였다. 이건 문제 하나 하나 뜯어봐야겠다.

 

ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서

테이블 2개 나와서 JOIN 했는데 이 문제는 JOIN이 아닌 UNION을 사용해서 푸는 문제다.

JOIN과 UNION은 무슨 차이가 있을까?

즉, 두 테이블이 관련이 있을 때는 JOIN을, 없을 때는 UNION을 사용하면 된다.

이 문제에서 온라인 판매 데이터와 오프라인 판매 데이터는 서로 관련이 없기 때문에 UNION을 사용한다. 

 

오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. 

UNION을 사용하려면 칼럼 개수가 같아야 한다. 근데 ONLINE_SALE 테이블은 칼럼이 5개고, OFFLINE_SALE 테이블은 칼럼이 4개다.

 

OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요.

이 부분이 힌트다. 칼럼 개수를 맞춰주기 위해 OFFLINE_SALE 테이블에 NULL로 구성된 USER_ID 칼럼을 만들어야 한다.

 

결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.

UNION 후에 ORDER BY는 어떻게 해야 할까?

그냥 하면 된다. UNION은 ORDER BY 전인 SELECT 절에서 처리되기 때문에 평소에 하던 것처럼 맨 마지막에 ORDER BY 절 적으면 된다.

 

 

정답 코드는 다음과 같다.

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

UNION

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

ORDER BY SALES_DATE
       , PRODUCT_ID
       , USER_ID

UNION과 UNION ALL은 둘 다 합집합인데 중복을 제거 여부 차이가 있다.

UNION이 중복 제거고 UNION ALL은 아님

 

이 문제에서는 둘 중 아무거나 써도 정답 처리 되었다.

728x90