부제:
자동차 대여 기록 별 대여 금액 구하기, 레벨 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: 소수점 아래를 버려 정수 형태의 금액을 산출.
'SQL 알고리즘 코드카타' 카테고리의 다른 글
| SQL 알고리즘 코드카타 27일차(1) 26.01.25(일) (0) | 2026.01.25 |
|---|---|
| SQL 알고리즘 코드카타 26일차(1) 26.01.24(토) (0) | 2026.01.24 |
| SQL 알고리즘 코드카타 24일차(1) 26.01.22(목) (0) | 2026.01.22 |
| SQL 알고리즘 코드카타 23일차(3) 26.01.21(수) (0) | 2026.01.21 |
| SQL 알고리즘 코드카타 23일차(2) 26.01.21(수) (0) | 2026.01.21 |