Programming/SQL

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

용스토리랜드 2024. 7. 23. 20:30

💡문제 설명

 

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

 

💡예시

 

💡풀이 코드

 

  • 1. ONLINE_SALE 테이블에서 SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT 열을 선택합니다.
    • DATE_FORMAT(SALES_DATE, "%Y-%m-%d") SALES_DATE: SALES_DATE를 'YYYY-MM-DD' 형식으로 포맷합니다.
    • WHERE MONTH(SALES_DATE) = 3: SALES_DATE가 3월인 행만 선택합니다.
  • 2. OFFLINE_SALE 테이블에서 SALES_DATE, PRODUCT_ID, SALES_AMOUNT 열을 선택하고 USER_ID는 NULL로 설정합니다.
    • DATE_FORMAT(SALES_DATE, "%Y-%m-%d") SALES_DATE: SALES_DATE를 'YYYY-MM-DD' 형식으로 포맷합니다.
    • NULL AS USER_ID: USER_ID를 NULL로 설정합니다.
    • WHERE MONTH(SALES_DATE) = 3: SALES_DATE가 3월인 행만 선택합니다.
  • 3. UNION을 사용하여 두 SELECT 문의 결과를 병합합니다. UNION은 기본적으로 중복을 제거합니다.
  • 4. 병합된 결과를 SALES_DATE, PRODUCT_ID, USER_ID 순으로 정렬합니다.

* 해당 문제에서는 UNION , UNION ALL 모두 사용 가능했습니다. 

 

SELECT 
    DATE_FORMAT(SALES_DATE, "%Y-%m-%d") SALES_DATE,
    PRODUCT_ID, 
    USER_ID, 
    SALES_AMOUNT
FROM ONLINE_SALE
WHERE MONTH(SALES_DATE) = 3
UNION 
SELECT 
    DATE_FORMAT(SALES_DATE, "%Y-%m-%d") SALES_DATE,
    PRODUCT_ID, 
    NULL AS USER_ID,
    SALES_AMOUNT
FROM OFFLINE_SALE
WHERE MONTH(SALES_DATE) = 3
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID

💡UNION (VS) UNION ALL

 

  • UNION: 두 SELECT 문의 결과를 합친 후 중복된 행을 제거합니다. 중복을 제거하는 과정 때문에 더 많은 시간이 걸릴 수 있습니다.
  • UNION ALL: 두 SELECT 문의 결과를 합친 후 중복된 행도 모두 포함합니다. 중복을 제거하지 않기 때문에 UNION보다 더 빠릅니다.

따라서 중복된 데이터를 제거해야 하는 경우 UNION을 사용하고, 모든 데이터를 빠르게 병합해야 하는 경우 UNION ALL을 사용하는 것이 좋습니다.

 

공통점 : 

 

  • 세로(행 방향)로 합치기: 두 개 이상의 SELECT 문의 결과를 세로로 병합합니다.
  • 열의 개수와 데이터 형식 일치: 각 SELECT 문의 결과는 동일한 수의 열을 가져야 하며, 각 열의 데이터 형식이 일치해야 합니다.
  • 결과 통합: 두 개 이상의 결과 세트를 하나로 통합합니다.

 

사례 )

1. 온라인.오프라인 판매 데이터 합 

2. 다양한 소스의 사용자 활동 로그 통합 

3. 지역별 판매 데이터 병합

 

반응형