CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
CAR_ID : 자동차 ID
CAR_TYPE : 자동차 종류
ㄴ '세단', 'SUV', '승합차', '트럭', '리무진’
DAILY_FEE : 일일 대여 요금(원)
OPTIONS : 자동차 옵션 리스트
ㄴ 자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트’
HISTORY_ID :자동차 대여 기록 ID
CAR_ID :자동차 ID
START_DATE: 대여 시작일
END_DATE: 대여 종료일
PLAN_ID :요금 할인 정책 ID
CAR_TYPE :자동차 종류
DURATION_TYPE :대여 기간 종류
DISCOUNT_RATE: 할인율(%)
할인율이 적용되는 대여 기간 종류로는 '7일 이상' (대여 기간이 7일 이상 30일 미만인 경우), '30일 이상' (대여 기간이 30일 이상 90일 미만인 경우), '90일 이상' (대여 기간이 90일 이상인 경우) 이 있습니다. 대여 기간이 7일 미만인 경우 할인정책이 없습니다.
WITH A AS (SELECT H.HISTORY_ID, C.DAILY_FEE
, DATEDIFF(H.END_DATE, H.START_DATE)+1 AS 'RENTAL_DAYS' # FEE계산을 위한 렌탈 기간 구하기
, 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 '7일 이하' END DURATION_TYPE # CAR_RENTAL_COMPANY_DISCOUNT_PLAN과 join하기 위함
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H
JOIN CAR_RENTAL_COMPANY_CAR C ON C.CAR_ID = H.CAR_ID
WHERE CAR_TYPE = '트럭')
SELECT A.HISTORY_ID
, IF(B.DURATION_TYPE IS NULL, A.DAILY_FEE * A.RENTAL_DAYS, ROUND((A.DAILY_FEE * (100-B.DISCOUNT_RATE)*0.01) * A.RENTAL_DAYS,0)) AS 'FEE'
FROM A
LEFT JOIN (SELECT * FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN WHERE CAR_TYPE='트럭') B ON A.DURATION_TYPE = B.DURATION_TYPE
ORDER BY FEE DESC, HISTORY_ID DESC
DATEDIFF(END_DATE, START_DATE)에 +1을 해주는 이유는
2022-10-01 ~ 2022-10-01 동안 대여를 했을 때, 실제 빌린 기간은 1일이지만 DATEDIFF를 이용해 구한 일수는 0일로 나오기 때문에 모든 데이터에 +1을 해줘야한다.