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

hysss·2023년 2월 15일
0

SELECT - 오프라인/온라인 판매 데이터 통합하기

문제 분석

ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서
2022년 3월
오프라인/온라인 상품 판매 데이터
판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요.
OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요.
결과는 판매일을 기준으로 오름차순 정렬해주시고
판매일이 같다면 상품 ID를 기준으로 오름차순,
상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.

코드

SELECT *
FROM (SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
      FROM ONLINE_SALE
      WHERE YEAR(SALES_DATE)=2022 AND MONTH(SALES_DATE)=3
      UNION ALL
      SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
      FROM OFFLINE_SALE
      WHERE YEAR(SALES_DATE)=2022 AND MONTH(SALES_DATE)=3) AS SALE
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

문제 풀이

Join이 아니라 테이블의 합집합을 이용해서 테이블을 합치는 문제였다.

테이블의 합집합은 UNION, UNION ALL로 구할 수 있다.

  • UNION: 중복을 제거한 합집합을 구한다. (UNION DISTICT의 줄임말)
  • UNION ALL: 중복을 제거하지 않고 합집합을 구한다.

두 번째로 고민했던 점은 OFFLINE_SALE 테이블에는 USER_ID 컬럼이 존재하지 않는다는 것이었는데, 테이블 자체를 ALTER 구문으로 바꿔야 하나 했지만 바뀌지 않았다.
이후에 그냥 NULL을 SELECT 절에 넣으면 된다는 것을 알게 되었다.

SELECT NULL AS USER_ID
FROM OFFLINE_SALE

Join으로만 해결하려다 보니 GROUP BY를 써야 하나, 서브 쿼리를 이용해야 하나 하고 머리가 복잡해졌었다. 문제의 '오프라인/온라인 상품 판매 데이터의 판매량을 출력하라'는 조건을 보고 오프라인 상품 판매량과 온라인 상품 판매량의 수량을 합쳐야 하는 줄 알고 해맸던 것도 컸다.

profile
매일 매일 규칙적으로

0개의 댓글