[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기 - MySQL
문제
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/151141
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 알고리즘 분류 - String, Date
- 난이도 - Level 4
관련 개념
형변환 함수 - CAST()
CAST(변경 대상 AS 변경 타입)
*정수와 문자가 혼용된 문자열을 정수형으로 형변환 할 경우, 숫자 형태의 문자만 남기고 그 문자만 변환해주는 듯 하다.
ex) cast('7일 이상' as unsigned) => 7
접근 방법
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블의 대여 기간에 따라 CAR_RENTAL_COMPANY_PLAN 테이블의 할인율을 적용하는 게 어려웠다.
다른 언어였다면 arr[0] <= x <= arr[1]와 같이 쓸 수 있었을 텐데, 인덱스 없이 값이 다른 테이블의 특정 범위에 속하는지에 대한 sql 쿼리는 어떻게 작성할지 모르겠어서, 일단 모든 할인율을 적용하고 그 중 대여료가 가장 적은 것을 택하도록 작성했다.
답안 코드
SELECT B.HISTORY_ID, MIN(ROUND(A.DAILY_FEE * (DATEDIFF(B.END_DATE, B.START_DATE) + 1) * CASE
WHEN DATEDIFF(B.END_DATE, B.START_DATE) + 1 >= CAST(C.DURATION_TYPE as unsigned)
THEN (100-C.DISCOUNT_RATE) / 100
ELSE 1
END,0)) AS FEE
FROM CAR_RENTAL_COMPANY_CAR A, CAR_RENTAL_COMPANY_RENTAL_HISTORY B, CAR_RENTAL_COMPANY_DISCOUNT_PLAN C
WHERE A.CAR_TYPE = '트럭'
AND C.CAR_TYPE = '트럭'
AND A.CAR_ID = B.CAR_ID
GROUP BY HISTORY_ID
ORDER BY FEE DESC, B.HISTORY_ID DESC