본문 바로가기
코테 공부 🔥

[프로그래머스/SQL] 오프라인/온라인 판매 데이터 통합하기

by 서니서닝 2023. 4. 20.
728x90

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

프로그래머스

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

programmers.co.kr

문제 예시
ONLINE_SALE

OFFLINE_SALE

원하는 출력값

  • 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력
  • OFFLINE_SALE의 판매 데이터 USER_ID는 NULL로 표시
  • 판매일, 상품ID, 유저ID 를 오름차순

 

📌 풀이 )

UNION ALL을 사용하여서 풀었다!
UNION ALL은 함수는 구조가 같은 두 테이블, 또는 두 조회 결과를 합하여 합집합처럼 만들어 결과를 출력해준다.
 
즉 여기서는 ONLINE_SALE_ID와 OFFLINE_SALE_ID가 데이터 구조는 같지만 이름이 다르다.

 OFFLINE_SALE 테이블도 SELECT *하면 너무 좋겠지만, USER_ID가 없기 때문에  NULL값을 저장하도록 하여 ONLINE_SALE 테이블과 같게 해준다.
 
그 후에는 조건에 맞게 출력!
GROUP BY SALES_DATE, PRODUCT_ID, USER_ID도 추가해주었다가, 문제 내에서
동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.
라고 하여서 그냥 빼주었다.

SELECT 
    DATE_FORMAT(T.SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
    T.PRODUCT_ID,
    T.USER_ID,
    T.SALES_AMOUNT
FROM 
(
    SELECT *
    FROM ONLINE_SALE
    
    UNION ALL
    
    SELECT 
        OFFLINE_SALE_ID AS ONLINE_SALE_ID,
        NULL AS USER_ID,
        PRODUCT_ID,
        SALES_AMOUNT,
        SALES_DATE
    FROM OFFLINE_SALE        
) AS T

WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
728x90

댓글