ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/131537
- 나의 풀이(구현 완전히는 못함)
SELECT *
FROM ONLINE_SALE AS A
LEFT JOIN OFFLINE_SALE AS B ON A.SALES_DATE = B.SALES_DATE
- 다른 사람 풀이
(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
(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, product_id, user_id
- 풀이 해설
첫 번째 SELECT 문 (온라인 판매 데이터):
DATE_FORMAT(sales_date, "%Y-%m-%d")은 sales_date를 "2022-03-01" 형식으로 포맷합니다.
product_id: 상품 ID를 선택합니다.
user_id: 사용자 ID를 선택합니다.
sales_amount: 판매 금액을 선택합니다.
FROM online_sale: online_sale 테이블에서 데이터를 가져옵니다.
WHERE DATE_FORMAT(sales_date, "%Y-%m") = "2022-03": 판매 날짜가 "2022-03"인 행만 선택합니다.
UNION 연산자:
첫 번째 SELECT 결과와 두 번째 SELECT 결과를 합칩니다. 중복된 행은 제거됩니다.
두 번째 SELECT 문 (오프라인 판매 데이터):
DATE_FORMAT(sales_date, "%Y-%m-%d"): 온라인 판매와 마찬가지로 판매 날짜를 "2022-03-01" 형식으로 포맷합니다.
product_id: 상품 ID를 선택합니다.
NULL AS user_id: 오프라인 판매 데이터에서는 사용자 ID가 없으므로 NULL로 표시합니다.
sales_amount: 판매 금액을 선택합니다.
FROM offline_sale: offline_sale 테이블에서 데이터를 가져옵니다.
WHERE DATE_FORMAT(sales_date, "%Y-%m") = "2022-03": 판매 날짜가 "2022-03"인 행만 선택합니다.
ORDER BY 절:
sales_date, product_id, user_id의 순서로 결과를 정렬합니다.
원본 테이블에 없는 데이터를 'NULL'로 나타내기 위해서 'NULL AS user_id' 이렇게 구현하면 된다.
원본 테이블의 날짜 데이터는 '2022-01-01 00:00:00' 형식이었다. 샘플 예시를 보면 '2022-03-01' 형식으로 날짜형식을 포맷팅해줘야 한다. -> DATE_FORMAT(sales_date, "%Y-%m-%d")
3월의 판매 데이터를 구하는 것이므로 판매 날짜가 "2022-03"인 행만 선택 -> WHERE DATE_FORMAT(sales_date, "%Y-%m") = "2022-03"