코딩테스트/SQL
프로그래머스 - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기
nandy
2023. 6. 10. 18:01
https://school.programmers.co.kr/learn/courses/30/lessons/157339
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
테이블 분석
주어진 3개의 테이블을 조합하여, 2022년 11월 기준 30일 기준 렌트하였을 때 특정 조건에 만족하는 차량 리스트를 뽑아내는 문제입니다.
테이블 설명 및 필드 설명은 아래와 같으며, 아래 작성할 쿼리에서 사용할 필드는 BOLD 처리하였습니다.
- CAR_RENTAL_COMPANY_CAR (렌트차 정보 테이블)
- CAR_ID (차량ID)
- CAR_TYPE (차종)
- DAILY_FEE (일일 이용요금)
- OPTIONS (차량옵션)
- CAR_RENTAL_COMPANY_RENTAL_HISTORY (렌트차 렌트 이력 테이블)
- HISTORY_ID (히스토리 ID)
- CAR_ID (차량ID)
- START_DATE (차량 대여시작일자)
- END_DATE (차량 대여종료일자)
- CAR_RENTAL_COMPANY_DISCOUNT_PLAN (렌트차 대여기간 별 할인정책)
- PLAN_ID (할인정책ID)
- CAR_TYPE (차종)
- DURATION_TYPE (대여기간 종류)
- DISCOUNT_RATE (할인율)
문제 : 2022년 11월 대여 가능한 차량들 중 차종이 세단 혹은 SUV이고, 30일 대여를 할 경우 일일대여료, 할인율을 고려하여 50만원 이상 200만원 미만 차량 목록 출력하기.
유의사항
- CAR_RENTAL_COMPANY_RENTAL_HISTORY (렌트차 렌트 이력 테이블) 에서 END_DATE > '2022-10-31' AND START_DATE < '2022-11-01' 인 차량들은 2022년 11월에 렌트가 불가하다.
- CAR_TYPE(차종) 이 세단 혹은 SUV 만 가능하다.
- CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에 있는 리스트 중에, DURATION_TYPE(30일 이상)이고 CAR_TYPE(세단 or SUV) 데이터를 가져와야 한다.
- FEE(최종요금) 필드에 소수점 제거해야 한다.
쿼리 작성하기
고려조건
- CAR_ID 중에 11월 렌트 이력이 있는 ID 는 리스트에서 제외한다.
- 총 금액 ( = 일일 대여료 * 30 * (100 - 할인율) / 100 ) 기준, 50만원 이상 200만원 미만
- 정렬 순은 FEE 내림차순, 차종 오름차순, 차량 ID 내림차순
Query Example
SELECT crcc.CAR_ID, crcc.CAR_TYPE, ROUND(crcc.DAILY_FEE * ((100 - crcdp.DISCOUNT_RATE) / 100) * 30) AS FEE
FROM CAR_RENTAL_COMPANY_CAR as crcc
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN as crcdp ON crcdp.CAR_TYPE = crcc.CAR_TYPE
WHERE crcc.car_type IN ('세단','SUV')
AND crcc.CAR_ID NOT IN (SELECT DISTINCT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE END_DATE > '2022-10-31' AND START_DATE < '2022-12-01'
ORDER BY CAR_ID)
AND crcdp.DURATION_TYPE = '30일 이상' AND ROUND(crcc.DAILY_FEE * 30 * (100 - crcdp.DISCOUNT_RATE) / 100) >= 500000 AND ROUND(crcc.DAILY_FEE * 30 * (100 - crcdp.DISCOUNT_RATE) / 100) < 2000000
ORDER BY FEE DESC, crcc.CAR_TYPE, crcc.CAR_ID DESC;
회고
쿼리를 하나하나 작성하는 과정에서 렌트 이력에 없는 데이터들을 고려하지 않아서, 초반에 실패한 쿼리들이 존재하는데
이런 세세한 부분까지 고려해서 작은 쿼리부터 하나하나씩 작성해야 성공적으로 쿼리를 작성할 수 있는것 같습니다.