
문제
- 프로그래머스 SQL 문제
오프라인/온라인 판매 데이터 통합하기/레벨 4- 문제 내용 : 하단 프로그래머스 문제 [링크]
내가 작성한 Query
WITH TEMP_01 AS ( (SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE , PRODUCT_ID , USER_ID , SUM(SALES_AMOUNT) AS SALES_AMOUNT FROM ONLINE_SALE WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31' GROUP BY SALES_DATE, PRODUCT_ID, USER_ID) UNION ALL (SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE , PRODUCT_ID , CASE WHEN 1=1 THEN NULL END AS USER_ID , SUM(SALES_AMOUNT) AS SALES_AMOUNT FROM OFFLINE_SALE WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31' GROUP BY SALES_DATE, PRODUCT_ID, USER_ID) ) SELECT SALES_DATE, PRODUCT_ID, USER_ID, SUM(SALES_AMOUNT) AS SALES_AMOUNT FROM TEMP_01 GROUP BY SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
먼저 온라인 데이터의 합계를 구하자. ONLINE_SALE 테이블에서 '2022년 3월' 데이터만 추출하기 위해 WHERE 절에 SALES_DATE가 '2022-03'인 데이터 조건을 준다.
GROUP BY 절에서 SALES_DATE, PRODUCT_ID, USER_ID 를 기준으로 그룹핑한다. (SALES_AMOUNT 합계를 일자별, 제품별, 유저별로 구하기 위해)
DATE_FORMAT 함수를 통해 SALES_DATE를 '연-월-일' 형식으로 출력하고, SUM(SALES_AMOUNT) 함수를 통해 판매량 합계를 구해준다.
이제 오프라인 데이터의 합계를 구하자. 합계를 구하는 방식은 위에서 구한 온라인 데이터의 합계와 같지만, OFFLINE_SALE에는 USER_ID 컬럼이 없다. 따라서 이 컬럼을 만들어줘야 추후에 UNION ALL 이 가능하다.
CASE WHEN THEN 을 사용하여 모든 값이 'NULL'인 USER_ID 컬럼을 만들어준다.
위에서 구한 ONLINE_SALE 합계 데이터와 OFFLINE_SALE 합계 데이터를 UNION ALL로 합쳐주고 이를 'TEMP_01' 테이블로 만들어준다.
GROUP BY를 통해 TEMP_01의 데이터들을 다시 SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT 기준으로 그룹핑해준다.
SUM(SALES_AMOUNT)를 한 번 더 해주어서 온라인/오프라인 SALES_AMOUNT의 합계를 구해준다.
ORDER BY 를 통해 SALES_DATE PRODUCT_ID, USER_ID 순으로 오름차순 정렬해준다.
⭐⭐⭐ 각각의 데이터 집계정보가 담긴 데이터를 UNION ALL을 통해 다시 통합하는 문제였다. UNION ALL을 하기 위해서는 같은 컬럼을 가지고 있어야 하므로, CASE WHEN 을 통해 컬럼을 추가해주었다. 테이블을 합친 후 다시 집계함수를 통해 집계 데이터를 얻는 과정도 잘 공부해두기!
