-
[프로그래머스] 오프라인/온라인 판매 데이터 통합하기 Oracle코딩테스트 준비/SQL 2024. 10. 9. 20:16
https://school.programmers.co.kr/learn/courses/30/lessons/131537
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.
풀이1
- ONLINE_SALE 테이블과 OFFLINE_SALE 테이블
- 실제 업무에서는 어떤 테이블을 고르고 어떻게 테이블들을 연관짓느냐가 시작이겠지만,
문제에서는 테이블들이 주어졌기 때문에, 두 개의 테이블을 분석해본다.- 두 개의 테이블은 온/오프라인만 차이점이지 구성은 거의 똑같고,
온라인에서 산 제품은 USER_ID가 있는 것이 차이점이다.
- 두 개의 테이블은 온/오프라인만 차이점이지 구성은 거의 똑같고,
- 실제 업무에서는 어떤 테이블을 고르고 어떻게 테이블들을 연관짓느냐가 시작이겠지만,
- 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요.
- 문제에서 바라는 것은 두개의 테이블에서 JOIN을 해서 데이터를 얻거나 조회 조건을 변경하는 것이 아니라 오프라인이든 온라인이든 3월에 판매된 데이터를 조회하는 것이 목표다.
- UNION을 사용하여 비슷한 포멧의 테이블들을 합쳐 기간이 3월인 칼럼들을 조회해야겠다고 판단.
- USER_ID 값은 NULL 로 표시
- 온라인에서 산 제품은 USER_ID가 있는 것이 차이점이기 때문에 오프라인 테이블에서 추출한 서브 커리는 해당 컬럼을 NULL로 표시하도록 변경해야 한다.
- 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬
- 정렬 기준이다.
따라서, 다음과 같은 내용을 종합하면 아래와 같은 SQL 문이 나온다.
SELECT * FROM( SELECT TO_CHAR(SALES_DATE,'YYYY-MM-DD') SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT FROM ONLINE_SALE WHERE TO_CHAR(SALES_DATE,'YYYYMM') = '202203' UNION -- 테이블 UNION 사용 SELECT TO_CHAR(SALES_DATE,'YYYY-MM-DD') SALES_DATE, PRODUCT_ID, NULL USER_ID, -- USER ID NULL 처리 SALES_AMOUNT FROM OFFLINE_SALE WHERE TO_CHAR(SALES_DATE,'YYYYMM') = '202203' ) ORDER BY SALES_DATE,PRODUCT_ID,USER_ID -- 정렬기준
'코딩테스트 준비 > SQL' 카테고리의 다른 글
[프로그래머스] 대장균들의 자식의 수 구하기 (MySQL) (0) 2024.11.04 [프로그래머스] 업그레이드 된 아이템 구하기 Mysql (0) 2024.10.14 [프로그래머스] 상위 n개 레코드 ORACLE SQL (0) 2024.10.07 [프로그래머스] 서울에 위치한 식당 목록 출력하기 ORACLE (4) 2024.10.06 [프로그래머스] 강원도에 위치한 생산공장 목록 출력하기 (2) 2024.10.06 - ONLINE_SALE 테이블과 OFFLINE_SALE 테이블