[알고리즘][X] 오프라인/온라인 판매 데이터 통합하기

2023. 9. 14. 13:12알고리즘 풀이/SQL

문제 설명
다음은 어느 의류 쇼핑몰의 온라인 상품 판매 정보를 담은 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

참고해서 푼 풀이

- union을 몰라서 틀렸다. concat 생각했는데 없더라.

- union all은 중복된 데이터를 포함시킨다고 한다. 문제에서는 중복된 데이터가 없다고 했으니 union과 union all의 결과는 같다!

- order by를 할 때는 열 이름을 참조한다. 따라서 열에는 그 이름이 반드시 있어야 한다. date_format으로 열 이름이 바뀌게 되면 안된다!

- concat이 있기는 한데 문자열을 합치는 것이다.

select date_format(sales_date,"%Y-%m-%d") as sales_date, product_id, user_id, sales_amount from online_sale where sales_date like "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 sales_date like "2022-03%"

order by sales_date, product_id, user_id

Reference


https://monawa.tistory.com/104

 

SELECT 오프라인/온라인 판매 데이터 통합하기

https://school.programmers.co.kr/learn/courses/30/lessons/131537 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞

monawa.tistory.com

https://extbrain.tistory.com/52

 

[MySQL] 여러 문자열를 하나의 문자열로 합치기 (CONCAT 함수)

▶MySQL 여러 문자열를 하나의 문자열로 합치기 (CONCAT 함수) ▶설명 간혹 여러 문자열 혹은 컬럼 값을 합쳐서 가져와야 하는 경우가 있습니다.이 때 사용하는 함수가 CONCAT 함수입니다.CONCAT 함수는

extbrain.tistory.com