[SQL/코드카타] 프로그래머스 - 오프라인/온라인 판매 데이터 통합하기 | UNION & NULLIF

문제

https://school.programmers.co.kr/learn/courses/30/lessons/131537

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


✍️ 문제 요약

  • ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품
  • 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력
  • OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL로 표시
  • 판매일 오름차순, 상품ID 오름차순, 유저ID 오름차순 정렬

✍️ 내가 작성한 코드

  • 구글링해서 결국 풀어냄!!!
SELECT DATE_FORMAT(a.sales_date, '%Y-%m-%d') as sales_date,
       a.product_id,
       NULLIF(user_id, '') as user_id,
       a.sales_amount
FROM
(SELECT sales_date,
       product_id,
       user_id, 
       sales_amount
FROM online_sale AS o
UNION ALL
SELECT sales_date,
       product_id,
       NULL,
       sales_amount
FROM offline_sale AS f
) a
WHERE a.sales_date like '2022-03%'
ORDER BY sales_date ASC, product_id ASC, user_id ASC;

🔍 코드 설명

1. 두 테이블을 위아래로 합치기(UNION)

  • 두 테이블의 컬럼 수가 다르므로, NULL로 없는 컬럼 대체!
(
SELECT sales_date,
       product_id,
       user_id, 
       sales_amount
FROM online_sale
UNION
SELECT sales_date,
       product_id,
       NULL,               -- 🚨 존재하지 않는 컬럼을 NULL(컬럼)으로 대체
       sales_amount
FROM offline_sale
) a

2. 조건절 : 각각 2022년 03월 데이터 불러오기

(...) a
WHERE a.sales_date like '2022-03%'

3. SELECT 절에서 불러오려는 컬럼 명시

  • offline_sale 테이블의 user_id 컬럼 내용이 비어있으므로,  NULL 값 채워넣기
SELECT DATE_FORMAT(a.sales_date, '%Y-%m-%d') as sales_date,
       a.product_id,
       NULLIF(user_id, '') as user_id,      -- 🚨 user_id가 ''(빈칸)이면 NULL 할당
       a.sales_amount
FROM
(...) a
WHERE a.sales_date like '2022-03%'

4. 판매일 오름차순, 상품ID 오름차순, 유저ID 오름차순 정렬

ORDER BY sales_date ASC, product_id ASC, user_id ASC;

💡 새롭게 알게된 내용

1) UNION을 사용할 때, 각각의 컬럼 수가 다를 경우 합치는 방법 : NULL로 컬럼 대체

SELECT ...,
       user_id, 
       ...
FROM online_sale
UNION
SELECT ...,
       NULL,             -- 📌 동일한 위치에 NULL 입력 ➡️ ''(빈칸)으로 결합됨!!
       ... 
FROM offline_sale
offilne_sale 에 NULL로 컬럼 대체하면 ➡️ ' '(빈칸)으로 결합

2) NULLIF(컬럼A, 'B') : 만약 컬럼A에서 내용이 'B'이면, NULL 할당

 -- 📌 ''(공백)이면, NULL 할당
 NULLIF(user_id, '') as user_id

🎯 혹시 다른 풀이도 있나? 

SELECTFROM
 

끝.