02/10 SQL 문제풀이(⭐⭐⭐)

Data Architect / Engineer·2024년 2월 10일
1

1일_1SQL

목록 보기
29/63
post-thumbnail

문제

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

profile
질문은 계속돼 아오에

0개의 댓글