반응형

@notepad_jj2

츄르사려고 코딩하는집사입니다.


1. [프로그래머스/SQL] 오프라인/온라인 판매 데이터 통합하기 오라클(Oracle)

2. 문제 출처

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

 

프로그래머스

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

programmers.co.kr

 

3. 문제

다음은 어느 의류 쇼핑몰의 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블과 오프라인 상품 판매 정보를 담은 OFFLINE_SALE 테이블 입니다. ONLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.

Column nameTypeNullable

ONLINE_SALE_ID INTEGER FALSE
USER_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

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

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

Column nameTypeNullable

OFFLINE_SALE_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

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


문제

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

 

예시

예를 들어 ONLINE_SALE 테이블이 다음과 같고

ONLINE_SALE_IDUSER_IDPRODUCT_IDSALES_AMOUNTSALES_DATE

1 1 3 2 2022-02-25
2 4 4 1 2022-03-01
4 2 2 2 2022-03-02
3 6 3 3 2022-03-02
5 5 5 1 2022-03-03
6 5 7 1 2022-04-06

OFFLINE_SALE 테이블이 다음과 같다면

OFFLINE_SALE_IDPRODUCT_IDSALES_AMOUNTSALES_DATE

1 1 2 2022-02-21
4 1 2 2022-03-01
3 3 3 2022-03-01
2 4 1 2022-03-01
5 2 1 2022-03-03
6 2 1 2022-04-01

각 테이블의 2022년 3월의 판매 데이터를 합쳐서, 정렬한 결과는 다음과 같아야 합니다.

SALES_DATEPRODUCT_IDUSER_IDSALES_AMOUNT

2022-03-01 1 NULL 2
2022-03-01 3 NULL 3
2022-03-01 4 NULL 1
2022-03-01 4 4 1
2022-03-02 2 2 2
2022-03-02 3 6 3
2022-03-03 2 NULL 1
2022-03-03 5 5 1

 

4. 풀이

- 이 문제를 보자마자 좀 복잡하겠다 생각했었는데, 전혀 없었다. 그저 테이블 2개를 UNION ALL을 해서 가져오면 된다. 가장 먼저, 문제에서 ORDER BY에 대해 SALES_DATE, PRODUCT_ID, USER_ID에 대해 정렬을 하고, 각 ONLINE_SALE, OFFLINE_SALE 테이블에서 SALES_DATE(판매날짜)가 2022년 3월 데이터만 가져오면 된다. 그래서, 각 테이블에 대해 TO_CHAR 함수를 사용하여 데이터를 가져오고 UNION ALL을 해주면 된다.

- 여기서, 주의해야 할 점이 OFFLINE_SALE 테이블의 데이터에 대해서 USER_ID는 NULL로 처리를 해야 한다. 근데, 내가 실수했던 것은 'NULL' AS USER_ID로 해서 계속 데이터 타입이 맞지 않았다. ONLINE_SALE 테이블에서는 USER_ID가 INTEGER 타입이라 NULL AS USER_ID로 쿼리를 짜야 한다.

 

5. 소스 코드

--SELECT COUNT(*) FROM ONLINE_SALE 122개
--SELECT COUNT(*) FROM OFFLINE_SALE 79개

  SELECT *
    FROM (
        SELECT TO_CHAR(SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE
             , PRODUCT_ID
             , USER_ID
             , SALES_AMOUNT
          FROM ONLINE_SALE
         WHERE TO_CHAR(SALES_DATE, 'YYYYMM') = '202203'
     UNION ALL
        SELECT TO_CHAR(SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE
             , PRODUCT_ID
             , NULL AS USER_ID
             , SALES_AMOUNT
          FROM OFFLINE_SALE
         WHERE TO_CHAR(SALES_DATE, 'YYYYMM') = '202203'
    )
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기