Study/SQL

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

growingtree 2022. 11. 9. 17:58

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

 

문제

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

Column name Type Nullable
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 name Type Nullable
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를 기준으로 오름차순 정렬해주세요.

 

요약

1. 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매날짜, 상품ID, 유저ID, 판매량 출력

2. 조건 1 : OFFLINE_SALE 테이블의 USER_ID값은 NULL로 표시

3. 조건 2: 결과는 판매일을 기준으로 오름차순 정렬 , 상품 ID 기준으로 오름차순 정렬, 유저 ID 기준 오름차순 

 

 

아이디어

1. 조건 1의 경우, WHERE절로 2022년 3월의 데이터만 가지고 온다. 

2. 단순히 오프라인과 온라인 데이터를 합치는 문제라서 OUTER JOIN을 하면 될 것 같다. 

3. OFFLINE_SALE 테이블에는 USER_ID 칼럼이 없으니 서브쿼리를 사용해 NULL 값으로 채워진 칼럼을 추가한다. 

4. 조건 2의 경우, ORDER BY를 사용해서 처리 

 

참고)

MySQL에는 OUTER JOIN 연산자가 따로 없다. 

LEFT JOIN 하고 RIGHT JOIN 하고 둘을 UNION 하는 방식으로 접근 

 

SELECT DATE_FORMAT(OFF.SALES_DATE,"%Y-%m-%d") AS SALES_DATE, OFF.PRODUCT_ID AS PRODUCT_ID, OFF.USER_ID, OFF.SALES_AMOUNT AS SALES_AMOUNT
FROM (SELECT *,NULL AS USER_ID FROM OFFLINE_SALE) AS OFF LEFT JOIN  ONLINE_SALE AS ONN  
ON OFF.PRODUCT_ID = ONN.PRODUCT_ID  
WHERE MONTH(OFF.SALES_DATE) = "3" 

UNION

SELECT DATE_FORMAT(ONN.SALES_DATE,"%Y-%m-%d") AS SALES_DATE, ONN.PRODUCT_ID AS PRODUCT_ID, ONN.USER_ID, ONN.SALES_AMOUNT AS SALES_AMOUNT
FROM (SELECT *,NULL AS USER_ID FROM OFFLINE_SALE) AS OFF LEFT JOIN  ONLINE_SALE AS ONN  
ON OFF.PRODUCT_ID = ONN.PRODUCT_ID 
WHERE MONTH(ONN.SALES_DATE) = "3" 

ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

 

주의사항

OFFLINE_SALE의 USER_ID는 NULL로 처리해달라고 하는데 이때 문자열 "NULL"을 넣으면 안된다! -> 이것때문에 한참 헤맴; 

 

 

 

 

순간 ORDER BY랑 GROUP BY랑 헷갈려서 왜 정렬이 안되지.. 이러고 있었네;; 정신을 똑띠 차리고 봐야겠다.

반응형