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

오형상·2024년 6월 22일
0

프로그래머스_SQL

목록 보기
9/12
post-thumbnail

문제

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

Column NameTypeNullable
ONLINE_SALE_IDINTEGERFALSE
USER_IDINTEGERFALSE
PRODUCT_IDINTEGERFALSE
SALES_AMOUNTINTEGERFALSE
SALES_DATEDATEFALSE

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

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

Column NameTypeNullable
OFFLINE_SALE_IDINTEGERFALSE
PRODUCT_IDINTEGERFALSE
SALES_AMOUNTINTEGERFALSE
SALES_DATEDATEFALSE

동일한 날짜, 상품 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
11322022-02-25
24412022-03-01
42222022-03-02
36332022-03-02
55512022-03-03
65712022-04-06

OFFLINE_SALE 테이블이 다음과 같다면

OFFLINE_SALE_IDPRODUCT_IDSALES_AMOUNTSALES_DATE
1122022-02-21
4122022-03-01
3332022-03-01
2412022-03-01
5212022-03-03
6212022-04-01

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

SALES_DATEPRODUCT_IDUSER_IDSALES_AMOUNT
2022-03-011NULL2
2022-03-013NULL3
2022-03-014NULL1
2022-03-01441
2022-03-02222
2022-03-02363
2022-03-032NULL1
2022-03-03551

소스코드

SELECT
    DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
    PRODUCT_ID,
    USER_ID,
    SALES_AMOUNT
FROM
    ONLINE_SALE AS ONS
WHERE
    ONS.SALES_DATE LIKE '2022-03%'

UNION

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

ORDER BY
    SALES_DATE,
    PRODUCT_ID,
    USER_ID;

배운점

UNION은 SQL에서 두 개 이상의 SELECT 문을 결합하여 하나의 결과 집합으로 만드는 연산자입니다. UNION을 사용할 때 각 SELECT 문의 열 수와 데이터 유형이 일치해야 합니다.

UNION의 주요 특징:

  1. 중복 제거:

    • UNION은 결과 집합에서 중복된 행을 제거합니다. 즉, 결과 집합에 동일한 행이 여러 번 나타나면 한 번만 포함됩니다.
      SELECT column1, column2 FROM table1
      UNION
      SELECT column1, column2 FROM table2;
  2. 전체 구조 일치:

    • SELECT 문은 동일한 수의 열을 반환해야 하며, 각 열의 데이터 유형이 서로 호환되어야 합니다.

UNION ALL의 주요 특징:

  1. 중복 포함:
    • UNION ALL은 결과 집합에서 중복된 행을 제거하지 않습니다. 모든 행이 그대로 포함됩니다.
      SELECT column1, column2 FROM table1
      UNION ALL
      SELECT column2, column3 FROM table2;

출처 : https://www.devart.com/dbforge/sql/sqlcomplete/union-vs-union-all.html

0개의 댓글