[SQL] 오프라인/온라인 판매 데이터 통합하기

유지민·2024년 3월 4일

SQL

목록 보기
13/23
post-thumbnail

문제 보기

문제 설명

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

Column name	Type	Nullable
ONLINE_SALE_ID	INTEGER	FALSE
USER_ID	INTEGER	FALSE
PRODUCT_ID	INTEGER	FALSE
SALES_AMOUNT	INTEGER	FALSE
SALES_DATE	DATE	FALSE

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

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

Column name	Type	Nullable
OFFLINE_SALE_ID	INTEGER	FALSE
PRODUCT_ID	INTEGER	FALSE
SALES_AMOUNT	INTEGER	FALSE
SALES_DATE	DATE	FALSE

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

문제

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

예시

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

ONLINE_SALE_ID	USER_ID	PRODUCT_ID	SALES_AMOUNT	SALES_DATE
1	1	3	2	2022-02-25
2	4	4	1	2022-03-01
4	2	2	2	2022-03-02
3	6	3	3	2022-03-02
5	5	5	1	2022-03-03
6	5	7	1	2022-04-06

OFFLINE_SALE 테이블이 다음과 같다면

OFFLINE_SALE_ID	PRODUCT_ID	SALES_AMOUNT	SALES_DATE
1	1	2	2022-02-21
4	1	2	2022-03-01
3	3	3	2022-03-01
2	4	1	2022-03-01
5	2	1	2022-03-03
6	2	1	2022-04-01

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

SALES_DATE	PRODUCT_ID	USER_ID	SALES_AMOUNT
2022-03-01	1	NULL	2
2022-03-01	3	NULL	3
2022-03-01	4	NULL	1
2022-03-01	4	4	1
2022-03-02	2	2	2
2022-03-02	3	6	3
2022-03-03	2	NULL	1
2022-03-03	5	5	1

정답 코드

SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE AS N
WHERE YEAR(SALES_DATE) = 2022 AND MONTH(SALES_DATE) = 3
UNION
SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE AS F
WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

UNION : 두 개 이상의 SELECT문의 결과 통합

🚨🚨🚨 주의점 : 각 SELECT문의 컬럼 수와 데이터 타입이 일치해야 함

기본적으로 UNION은 두 쿼리 결과의 🚨중복을 제거함🚨

중복 결과를 포함하고자 할 때에는 UNION ALL 사용

  • UNION: 두 쿼리 결과의 중복된 레코드를 제거. 즉, 각각의 결과 집합에서 고유한 레코드만을 결과에 포함.
  • UNION ALL: 중복 제거를 수행하지 않고 모든 결과를 그대로 합침. 이는 중복된 데이터가 필요한 경우나 성능상의 이유로 사용.

YEAR(), MONTH(), DAY() or LIKE

WHERE절 내부 2022년 3월 체크 시, year(), month(), day() 사용으로/LIKE를 통한 문자열 비교로 컬럼에 조건을 걸어줬다.
결과는 당연히 같다!

WHERE YEAR(SALES_DATE) = 2022 AND MONTH(SALES_DATE) = 3
WHERE SALES_DATE LIKE '2022-03%'
profile
끊임없이 도전하며 사고하는 주니어 Web 개발자 유지민입니다.

0개의 댓글