SQL 알고리즘 코드카타

SQL 알고리즘 코드카타 25일차(1) 26.01.23(금)

nom_de_plume 2026. 1. 23. 21:45

부제:

자동차 대여 기록 별 대여 금액 구하기, 레벨 5

 

1. 문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/151141#
2. 정답 코드: 

SELECT 
    H.HISTORY_ID,
    FLOOR(C.DAILY_FEE * (DATEDIFF(H.END_DATE, H.START_DATE) + 1) * (1 - COALESCE(P.DISCOUNT_RATE, 0) / 100)) AS FEE
FROM CAR_RENTAL_COMPANY_CAR C
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P ON C.CAR_TYPE = P.CAR_TYPE
    AND P.DURATION_TYPE = (
        CASE 
            WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 90 THEN '90일 이상'
            WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 30 THEN '30일 이상'
            WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 7 THEN '7일 이상'
            ELSE NULL 
        END
    )
WHERE C.CAR_TYPE = '트럭'
ORDER BY FEE DESC, H.HISTORY_ID DESC;


3. 오류 상황:

SELECT
    h.history_id,
    case
        when h.history_id = 1 then c.daily_fee * 7 * (1 - p.discount_rate / 100)
        when h.history_id = 2 then c.daily_fee * 2 * (1 - p.discount_rate / 100)
        when h.history_id = 5 then c.daily_fee * 30 * (1 - p.discount_rate / 100)
    end as fee
from CAR_RENTAL_COMPANY_CAR as c
left join CAR_RENTAL_COMPANY_RENTAL_HISTORY as h
    on c.car_id = h.car_id
join CAR_RENTAL_COMPANY_DISCOUNT_PLAN as p
    on c.car_type = p.car_type
where c.car_type = "트럭"
group by h.history_id
order by fee desc, h.history_id desc;

=> 서브쿼리 미사용


4. 시도 방법:

=> 서브쿼리 사용


5. 최종 문제 해결 방법:

=> JOIN 조건 내 CASE 사용: LEFT JOIN 시 DURATION_TYPE을 대여 기간에 맞춰 동적으로 매칭. 7일 미만 대여 건은 조건에 맞는 duration_type이 없어 P.DISCOUNT_RATE가 NULL이 된다.

=> COALESCE(P.DISCOUNT_RATE, 0): 7일 미만 대여로 인해 할인율이 없는 경우 0%를 적용하여 원래 가격이 나오도록 설계했다.

=> DATEDIFF + 1: 당일 대여/반납도 1일로 계산해야 하므로 반드시 +1을 해줘야 한다.

=> FLOOR: 소수점 아래를 버려 정수 형태의 금액을 산출.