알고리즘/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