프로그래머스 MySQL : 오프라인/온라인 판매 데이터 통합하기 (8/26)

백엔ㄷ현·2024년 8월 26일
  • 문제 설명
    다음은 어느 의류 쇼핑몰의 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블과 오프라인 상품 판매 정보를 담은 OFFLINE_SALE 테이블 입니다. ONLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.
Column nameTypeNullable
ONLINE_SALE_IDINTEGERFALSE
USER_IDINTEGERFALSE
PRODUCT_IDINTEGERFALSE
SALES_AMOUNTINTEGERFALSE
SALES_DATEDATEFALSE

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

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

Column nameTypeNullable
OFFLINE_SALE_IDINTEGERFALSE
PRODUCT_IDINTEGERFALSE
SALES_AMOUNTINTEGERFALSE
SALES_DATEDATEFALSE

동일한 날짜, 상품 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

profile
매일매일 공부한 내용과 코드 기록하겠습니다

0개의 댓글