문제
- 프로그래머스 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
을 통해 컬럼을 추가해주었다. 테이블을 합친 후 다시 집계함수를 통해 집계 데이터를 얻는 과정도 잘 공부해두기!