DataBase/MySQL

[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기 - MySQL

Dev_en 2023. 2. 23. 11:34

문제

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