알고리즘/SQL
[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기
happenundo
2024. 7. 11. 21:19
728x90
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
WITH 절을 이용해 서브쿼리를 2개 만든 후 풀었다.
1. 트럭의 대여 기간 타입과 해당하는 할인율을 갖고 있는 테이블 TRUCK_DISCOUNT_PLAN
2. 트럭 대여기록 ID, 트럭 대여 기간 타입, 일일 요금, 빌린 날 수를 갖고 있는 테이블 TRUCK_RENTAL_HISTORY
TRUCK_RENTAL_HISTORY와 TRUCK_DISCOUNT_PLAN을 트럭 대여 기간 타입으로 LEFT OUTER JOIN한다. (트럭 대여기간 타입이 NULL인 경우에는 할인이 안 들어가게 하려고)
주의 해야 할 점은,
대여 시작 날짜 ~ 대여 종료 날짜 사이의 차를 통해 대여한 날수를 구할 때, DATEDIFF를 사용한 후 1을 더하는 방식으로 구해야 한다는 것이다.
예를 들어 8월 1일에 대여를 시작해 8월 3일에 대여를 종료했다면 3일 동안 대여 한 것이지만, DATEDIFF를 통해 계산하면 2가 나오므로 1을 더해준다.
-- 코드를 입력하세요
# 트럭의 대여 기간 종류, 할인률
WITH TRUCK_DISCOUNT_PLAN AS
(
SELECT DURATION_TYPE, DISCOUNT_RATE
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = "트럭"
),
# 트럭 대여 기록 ID, 트럭 대여 기간 타입, 일일 요금, 빌린 날 수
TRUCK_RENTAL_HISTORY AS
(
SELECT HISTORY_ID,
CASE
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 90 THEN "90일 이상"
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN "30일 이상"
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 7 THEN "7일 이상"
ELSE NULL
END AS DURATION_TYPE,
TRUCK_INFO.DAILY_FEE, DATEDIFF(END_DATE, START_DATE) + 1 AS DAYS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY JOIN
(
SELECT CAR_ID, DAILY_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = "트럭"
) TRUCK_INFO USING(CAR_ID)
)
SELECT HISTORY_ID,
CASE
WHEN DISCOUNT_RATE IS NULL THEN ROUND(DAILY_FEE * DAYS)
ELSE ROUND(DAILY_FEE * DAYS * (1 - DISCOUNT_RATE / 100))
END AS FEE
FROM TRUCK_RENTAL_HISTORY LEFT OUTER JOIN TRUCK_DISCOUNT_PLAN USING(DURATION_TYPE)
ORDER BY FEE DESC, HISTORY_ID DESC
728x90