꾸물꾸물 졔의 개발공부

[MySQL] 프로그래머스 - 오프라인/온라인 판매 데이터 통합하기 (UNION) 본문

알고리즘/SQL

[MySQL] 프로그래머스 - 오프라인/온라인 판매 데이터 통합하기 (UNION)

체제 2023. 5. 29. 20:23

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

💡UNION이란? 2개 이상 테이블에 존재하는 같은 성격의 값을 하나의 쿼리로 추출하는 것

 

 

문제

ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.


 

구현 과정

  • 2022년 3월의 온라인 상품 판매 데이터 출력 
  • 2022년 3월의 오프라인 상품 판매 데이터 출력 
  • 두 결과값 합치고 정렬 

 

1️⃣ 2022년 3월의 온라인 상품 판매 데이터 출력

ONLINE_SALE 테이블의 WHERE절에 2022년 3월 조건을 추가한다.

(문자열 일치)LIKE 연산자와 '%'을 사용하여 SALES_DATE의 앞부분에 '2022-03' 을 포함하고 있는 데이터만 출력하면 된다. 

판매날짜는 DATE_FORMAT() 함수를 사용하여 시간을 제외한 년-월-일만 출력하도록 한다. 

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%'

 

2️⃣ 2022년 3월의 오프라인 상품 판매 데이터 출력 

OFFLINE 테이블의 WHERE절에도 2022년 3월 조건을 추가한다. (1과 동일) 

OFFLINE 테이블에는 유저ID 컬럼이 존재하지 않기 때문에, 일단은 판매날짜, 상품ID, 판매량만 출력한다. 

SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, PRODUCT_ID,SALES_AMOUNT
FROM OFFLINE_SALE 
WHERE SALES_DATE LIKE '2022-03%'

 

3️⃣ (1,2) 두 결과값 합치고 정렬

1의 결과와 2의 결과를 합치기 위해 UNION 연산자를 사용한다. 단, 조회하는 컬럼의 갯수와 성격이 같아야 하는데 오프라인 상품 판매 데이터에는 USER_ID 가 없기 때문에 대응하는 컬럼이나 값을 채워주어야 한다. 

문제에서 NULL로 출력한다고 했기 때문에 USER_ID에 대응하는 값을 NULL로 통일 시켜 주면 됨 ! (→ SELECT ,,NULL,)

🌟 각 테이블의 컬럼 순서 일치 시켜 주기 

 

정렬은 우선순위 순서대로 콤마(,)로 구분하여 나열, 모두 오름차순 이기 때문에 따로 명시할 필요 없다. (DEFAULT 값 ASC) 

 


✔️코드

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, SALES_AMOUNT
FROM OFFLINE_SALE 
WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;