#IFNULL을 통해 discount_rate가 null인 부분을 모두 0으로 처리
SELECT HISTORY_ID, ROUND(daily_fee * (1 - IFNULL(discount_rate, 0) * 0.01) * DURATION, 0) AS FEE
FROM
p1
LEFT JOIN #LEFT JOIN을 통해 7일 이하 discount_rate을 null로 처리
(SELECT CAR_TYPE, duration_type, discount_rate
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN) p2
ON p1.duration_type = p2.duration_type
and p1.car_type = p2.car_type
ORDER BY FEE DESC, HISTORY_ID DESC
WITH p1 AS (
SELECT CAR_TYPE, daily_fee, history_id,
DATEDIFF(END_DATE, START_DATE) + 1 AS DURATION,
# p2 외래키
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 'NONE'
END duration_type
FROM CAR_RENTAL_COMPANY_CAR c,
CAR_RENTAL_COMPANY_RENTAL_HISTORY ch
WHERE c.CAR_ID = ch.CAR_ID
and c.CAR_TYPE = '트럭')
개인적으로 이런 형태는, 계산하려는 칼럼만 따로 담아서 조인하는 경우에 편리한거같다.
근래 풀어본 SQL 문제중에서 가장 어려운 문제인듯하다.