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

2023. 10. 19. 22:23알고리즘 풀이/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

나의 풀이

- NULL을 "NULL"로 해서 틀렸다. 근데 코드 실행한 결과 NULL이 하나도 없어도 이게 맞나 싶었지만 NULL as로 하는게 맞다. 실행결과에는 offline_sale 데이터가 없었던 거 같다. 

- NULL로 표시하라고 할 때는 NULL로 하자!!!

- 근데 살짝 애매하기는 하다.

- union은 ()을 안붙여도 마지막에 order by가 있으면 전체를 정렬해준다. 그리고 서브쿼리로 안하고 위에 쿼리에 order by를 하면 오류가 난다고 한다.

- 명확하게 해주기 위해서는 꼭 ()을 붙여주자!!!

(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
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://lovedb.tistory.com/226

 

[SQL Server] UNION을 ORDER BY와 같이 사용할 때 원하는 값 얻기

UNION, UNION ALL을 ORDER BY와 같이 사용할 때 원하는 결과를 얻지 못할 수 있다. 테스트를 위해 테이블을 생성하고 데이터를 삽입하였다. CREATE TABLE dbo.TEST_TBL ( ID INT IDENTITY(1,1) , NAME CHAR(8) , AGE TINYINT , G

lovedb.tistory.com