Programming/SQL
[프로그래머스 SQL] 오프라인/온라인 판매 데이터 통합하기
용스토리랜드
2024. 7. 23. 20:30
💡문제 설명
ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.
💡예시
💡풀이 코드
- 1. ONLINE_SALE 테이블에서 SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT 열을 선택합니다.
- DATE_FORMAT(SALES_DATE, "%Y-%m-%d") SALES_DATE: SALES_DATE를 'YYYY-MM-DD' 형식으로 포맷합니다.
- WHERE MONTH(SALES_DATE) = 3: SALES_DATE가 3월인 행만 선택합니다.
- 2. OFFLINE_SALE 테이블에서 SALES_DATE, PRODUCT_ID, SALES_AMOUNT 열을 선택하고 USER_ID는 NULL로 설정합니다.
- DATE_FORMAT(SALES_DATE, "%Y-%m-%d") SALES_DATE: SALES_DATE를 'YYYY-MM-DD' 형식으로 포맷합니다.
- NULL AS USER_ID: USER_ID를 NULL로 설정합니다.
- WHERE MONTH(SALES_DATE) = 3: SALES_DATE가 3월인 행만 선택합니다.
- 3. UNION을 사용하여 두 SELECT 문의 결과를 병합합니다. UNION은 기본적으로 중복을 제거합니다.
- 4. 병합된 결과를 SALES_DATE, PRODUCT_ID, USER_ID 순으로 정렬합니다.
* 해당 문제에서는 UNION , UNION ALL 모두 사용 가능했습니다.
SELECT
DATE_FORMAT(SALES_DATE, "%Y-%m-%d") SALES_DATE,
PRODUCT_ID,
USER_ID,
SALES_AMOUNT
FROM ONLINE_SALE
WHERE MONTH(SALES_DATE) = 3
UNION
SELECT
DATE_FORMAT(SALES_DATE, "%Y-%m-%d") SALES_DATE,
PRODUCT_ID,
NULL AS USER_ID,
SALES_AMOUNT
FROM OFFLINE_SALE
WHERE MONTH(SALES_DATE) = 3
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID
💡UNION (VS) UNION ALL
- UNION: 두 SELECT 문의 결과를 합친 후 중복된 행을 제거합니다. 중복을 제거하는 과정 때문에 더 많은 시간이 걸릴 수 있습니다.
- UNION ALL: 두 SELECT 문의 결과를 합친 후 중복된 행도 모두 포함합니다. 중복을 제거하지 않기 때문에 UNION보다 더 빠릅니다.
따라서 중복된 데이터를 제거해야 하는 경우 UNION을 사용하고, 모든 데이터를 빠르게 병합해야 하는 경우 UNION ALL을 사용하는 것이 좋습니다.
공통점 :
- 세로(행 방향)로 합치기: 두 개 이상의 SELECT 문의 결과를 세로로 병합합니다.
- 열의 개수와 데이터 형식 일치: 각 SELECT 문의 결과는 동일한 수의 열을 가져야 하며, 각 열의 데이터 형식이 일치해야 합니다.
- 결과 통합: 두 개 이상의 결과 세트를 하나로 통합합니다.
사례 )
1. 온라인.오프라인 판매 데이터 합
2. 다양한 소스의 사용자 활동 로그 통합
3. 지역별 판매 데이터 병합
반응형