문제
문제 링크
접근
- 이 문제를 필요했던 기본 개념이 꽤 있다.
- 문자열 처리 : REPLACE, SUBSTRING etc
- 문자 <-> 숫자 형변환 : CAST
- 연산 중 NULL 처리 : COALESCE
- 소수점 자르기 : FLOOR
- 서브쿼리, 조인, 정렬 etc
- 논리적으로는 이상 ~ 이하의 표에서 필요한 값을 얻어오는 방법 (MAX연산을 통해 해결)을 살피면 좋을 것 같다.
풀이
SELECT HISTORY_ID,
FLOOR( COALESCE(
(SELECT (100 - MAX(DISCOUNT_RATE)) / 100
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAST(REPLACE(DURATION_TYPE, '일 이상', '') AS SIGNED) <= (DATEDIFF(H.END_DATE, H.START_DATE) + 1)
AND CAR_TYPE = '트럭'), 1) * DAILY_FEE * (DATEDIFF(H.END_DATE, H.START_DATE) + 1)) AS FEE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H
JOIN CAR_RENTAL_COMPANY_CAR C ON H.CAR_ID = C.CAR_ID
WHERE CAR_TYPE = '트럭'
ORDER BY FEE DESC, HISTORY_ID DESC