프로그래머스_자동차 대여 기록 별 대여 금액 구하기
SELECT H.HISTORY_ID, ROUND((DATEDIFF(END_DATE, START_DATE)+1)*C.DAILY_FEE*(100-IFNULL(P.DISCOUNT_RATE, 0))/100) AS FEE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS H
JOIN CAR_RENTAL_COMPANY_CAR AS C ON H.CAR_ID = C.CAR_ID
LEFT OUTER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS P
ON C.CAR_TYPE = P.CAR_TYPE AND P.DURATION_TYPE = (
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일 이상'
END)
WHERE C.CAR_TYPE = '트럭'
GROUP BY H.HISTORY_ID
ORDER BY FEE DESC, H.HISTORY_ID DESC
- 대여 기록별 -> GROUP BY
- 대여 금액 -> 일일 대여 요금x대여 기간x기간 별 할인율 을 정수로 반올림한다. 이 때 대여기간이 NULL일 경우에는 0으로 바꿔줘야하고, DURATION_TYPE에 따른 DURATION_RATE를 가져온다.
- 차량 정보 테이블 & 차량 대여 기록 테이블 -> 갖고 있는 차량 중에, 대여한 차량만 가져오면 되므로 INNER JOIN
- 차량 정보 테이블 & 종류 별 할인율 테이블 -> CAR_TYPE이 겹치기 때문에 처음에 INNER JOIN으로 했다가 계속 틀렸다. INNER JOIN을 하면 차량 대여 기간이 7일 미만인 경우에 대해 정보가 없기 때문에, 대여 기간이 7일 미만인 기록이 사라진다. 따라서 차량 정보 테이블을 왼쪽에 두고 LEFT OUTER JOIN을 해야한다.
- CAR_TYPE이 차량 정보 테이블과 할인율 테이블 둘 다 있길래 WHERE문을 P.CAR_TYPE = '트럭' 했다가 또 틀렸다. 차량 정보 테이블을 기준으로 대여 기간을 구할 수 있기 때문에, C.CAR_TYPE으로 해줘야 한다
이 문제만 1시간이 넘게 걸렸다..휴휴