프로그래머스 Lv4. 오프라인/온라인 판매 데이터 통합하기
2023. 8. 16. 15:30ㆍSQL/SQL 테스트 연습
문제 설명
다음은 어느 의류 쇼핑몰의 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블과 오프라인 상품 판매 정보를 담은 OFFLINE_SALE 테이블입니다. ONLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.
Column name | Type | Nullable |
ONLINE_SALE_ID | INTEGER | FALSE |
USER_ID | INTEGER | FALSE |
PRODUCT_ID | INTEGER | FALSE |
SALES_AMOUNT | INTEGER | FALSE |
SALES_DATE | DATE | FALSE |
동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다. OFFLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 OFFLINE_SALE_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 오프라인 상품 판매 ID, 상품 ID, 판매량, 판매일을 나타냅니다.
Column name | Type | Nullable |
OFFLINE_SALE_ID | INTEGER | FALSE |
PRODUCT_ID | INTEGER | FALSE |
SALES_AMOUNT | INTEGER | FALSE |
SALES_DATE | DATE | FALSE |
동일한 날짜, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.
ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저 ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL로 표시해 주세요. 결과는 판매일을 기준으로 오름차순 정렬해 주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품 ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해 주세요.
문제 풀이
SELECT
DATE_FORMAT(SALES_DATE, '%Y-%m-%d') SALES_DATE,
PRODUCT_ID,
USER_ID,
SALES_AMOUNT
FROM
(
SELECT
SALES_DATE,
PRODUCT_ID,
USER_ID,
SALES_AMOUNT
FROM
ONLINE_SALE
WHERE
SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31'
UNION ALL
SELECT
SALES_DATE,
PRODUCT_ID,
NULL AS USER_ID,
SALES_AMOUNT
FROM
OFFLINE_SALE
WHERE
SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31'
) AS SALE
ORDER BY
SALES_DATE ASC,
PRODUCT_ID ASC,
USER_ID ASC;
- 서브쿼리 (Subquery) 내에서 두 개의 SELECT 문을 UNION ALL로 결합:
- 첫 번째 SELECT 문은 ONLINE_SALE 테이블에서 정보를 가져옵니다. 여기서는 2022년 3월 1일부터 2022년 3월 31일까지의 판매 정보만 필터링하여 가져옵니다.
- 두 번째 SELECT 문은 OFFLINE_SALE 테이블에서 정보를 가져옵니다. 이때, USER_ID는 오프라인 판매에서는 사용되지 않으므로 NULL로 표시됩니다. 이 SELECT문도 첫 번째 SELECT 문과 동일하게 2022년 3월 1일부터 2022년 3월 31일까지의 판매 정보만 필터링하여 가져옵니다.
- UNION ALL은 두 쿼리의 결과를 모두 합쳐줍니다. (UNION은 중복을 제거하지만, UNION ALL은 중복을 제거하지 않습니다.)
- 서브쿼리의 결과를 바탕으로 외부 쿼리 실행:
- DATE_FORMAT 함수를 사용하여 SALES_DATE의 형식을 'YYYY-MM-DD' 형식으로 변환합니다.
- PRODUCT_ID, USER_ID, SALES_AMOUNT도 함께 선택됩니다.
- 최종 결과 정렬:
- 결과는 먼저 SALES_DATE 기준으로 오름차순 정렬됩니다.
- SALES_DATE가 동일한 경우, PRODUCT_ID로 오름차순 정렬됩니다.
- 그리고 PRODUCT_ID가 동일한 경우, USER_ID로 오름차순 정렬됩니다.
'SQL > SQL 테스트 연습' 카테고리의 다른 글
프로그래머스 Lv4. 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2023.08.17 |
---|---|
프로그래머스 Lv4. 입양 시각 구하기(2) (0) | 2023.08.16 |
프로그래머스 Lv4. 그룹별 조건에 맞는 식당 목록 출력하기 (0) | 2023.08.16 |
프로그래머스 Lv4. 저자 별 카테고리 별 매출액 집계하기 (0) | 2023.08.16 |
프로그래머스 Lv4. 주문량이 많은 아이스크림들 조회하기 (0) | 2023.08.16 |