[프로그래머스] LEVEL4 오프라인/온라인 판매 데이터 통합하기(SQL)

Loopy·2023년 10월 19일
1

프로그래머스

목록 보기
29/32
post-thumbnail

[프로그래머스] LEVEL4 오프라인/온라인 판매 데이터 통합하기


🧐 문제 설명


😍 나의 풀이

문제가 어려운 것은 아니나, 포스팅을 하기로 결정한 이유는 지난 시간에 풀었던 SQL 문제에서는 JOIN을 사용했고, 이번에는 UNION을 사용하기 때문에 둘의 차이점을 명확히 하고자 합니다.


  1. 온라인 판매 데이터, 오프라인 판매 데이터를 조건에 따라 각각 SELECT
  • 문제에서 ONLINE_SALE 테이블과 OFFLINE_SALE 테이블의 공통된 속성을 바탕으로 두 테이블을 JOIN 할 필요가 없으며, 각각의 테이블에서 조회된 쿼리의 결과를 합쳐서 보여주면 됩니다. 2022년 3월의 데이터를 추출하기 위해서 WHERE절의 조건과 요구하는 출력 데이터 형식을 충족하기 위해서 DATE_FORMAT()을 사용했습니다.

  1. 두 개의 SELECT 쿼리를 UNION
  • 온라인 판매 데이터, 오프라인 판매 데이터를 모두 보여주기 위해서 각각의 쿼리를 구한 다음 UNION을 사용하여 결합하였습니다. UNION은 중복된 결과를 보여주지 않고, UNION ALL은 중복된 결과를 보여줍니다. 위 문제에서는 각각의 테이블이 온라인, 오프라인으로 구분된 데이터만을 가지므로 중복된 데이터가 존재할 수 없기 때문에 UNION, UNION ALL 아무거나 사용해도 괜찮습니다.

  1. UNION 한 쿼리 결과를 ORDER BY
  • 문제에서 요구하는 정렬 순서는 ORDER BY를 이용하면 손쉽게 해결할 수 있습니다. 다만, 위 문제에서는 오프라인 판매 데이터는 USER_ID 컬럼이 존재하지 않으므로, 오프라인 판매 데이터를 SELECT 할 때 USER_ID 값을 NULL처리하면서 데이터를 추출해야한다는 점을 주의해야 합니다.

SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE SALES_DATE LIKE '2022-03-%'

UNION

SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE LIKE '2022-03-%'
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID

🥇 Today I Learn

UNION / UNION ALL

SELECT 컬럼1
FROM 테이블1
	UNION
SELECT 컬럼2
FROM 테이블2

UNION은 두 개의 쿼리 결과를 결합하는 SQL의 집합 연산입니다. UNION의 결과는 각 쿼리의 결과 튜플을 포함하기 때문에 두 릴레이션은 같은 수의 속성을 가져야 합니다. UNION은 두 쿼리 결과의 중복을 제거하고 보여주지만, UNION ALL은 중복을 제거하지 않고 보여주기 때문에 쿼리 조회 속도는 UNION ALL이 더 빠릅니다.

JOIN과 UNION 차이점

JOIN은 두 릴레이션 사이에 서로 공통된 속성이 있어 이를 바탕으로 두 릴레이션의 튜플을 결합한다는 특징이 있습니다. 다시 말해, JOIN은 두 릴레이션 사이에 공통된 속성(ATTRIBUTES)이 반드시 한 가지 이상 존재해야 합니다.

JOIN은 컬럼이 옆으로 추가되는 방식이어서 병렬적이지만, UNION은 데이터가 아래로 추가되는 방식이라 직렬적입니다.

profile
공부 쫌 해!!!😂

0개의 댓글