- 문제 설명
다음은 어느 의류 쇼핑몰의 온라인 상품 판매 정보를 담은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를 기준으로 오름차순 정렬해주세요.
단순하게 join으로 풀려고 한참을 머리를 짜멨지만 답이 나오지 않았다.
offline_sale 테이블의 user_id 값은 null 로 표시한다는 문장에 답이 있었었다.
문제의 제목도 통합하기라 union all 함수를 써서 푸는 문제였다.
SELECT date_format(sales_date, '%Y-%m-%d') as sales_date
,product_id
,user_id
,sales_amount
from online_sale
where sales_date >= '2022-03-01' and sales_date < '2022-04-01'
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 >= '2022-03-01' and sales_date < '2022-04-01'
order by sales_date, product_id, user_id asc;
UNION
여러 개의 SELECT 문의 결과를 단일 결과 세트로 연결 표현할떄 사용
(합친 결과에서 중복되는 행은 하나만 표시합니다.
=>DISTINCT키워드를 따로 명시하지 않아도 기본적으로 중복되는 레코드를 제거)
UNION내의 각SELECT문은 같은 수의 열을 가져야 한다.
각각SELECT문의 열은 또한 동일한 순서로 있어야 한다.
열은 호환되는 데이터 형식을 가져야 한다.
SELECT * FROM A
UNION (ALL)
SELECT * FROM B
[MY SQL] JOIN과 UNION - UNION
출처 : https://www.devart.com/dbforge/sql/sqlcomplete/union-vs-union-all.html