문제
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은 아님
이 문제에서는 둘 중 아무거나 써도 정답 처리 되었다.
'IT > SQL' 카테고리의 다른 글
[MySQL] 프로그래머스 SELECT 15 아픈 동물 찾기 (0) | 2023.10.01 |
---|---|
[MySQL] 프로그래머스 SELECT 14 역순 정렬하기 (0) | 2023.10.01 |
[MySQL] 프로그래머스 SELECT 12 재구매가 일어난 상품과 회원 리스트 구하기 (0) | 2023.09.27 |
[MySQL] 프로그래머스 SELECT 11 모든 레코드 조회하기 (0) | 2023.09.27 |
[MySQL] 프로그래머스 SELECT 10 흉부외과 또는 일반외과 의사 목록 출력하기 (0) | 2023.09.27 |