본문 바로가기
공부 일지/문제풀이

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

by Joshbla 2024. 11. 24.

코딩테스트 연습 - 자동차 대여 기록 별 대여 금액 구하기

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/151141

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

CAR_RENTAL_COMPANY_CAR 자동차 종류, 대여비용 테이블

CAR_RENTAL_COMPANY_RENTAL_HISTORY 자동차 대여 기록 테이블

CAR_RENTAL_COMPANY_DISCOUNT_PLAN 할인정보 테이블

이 있다. 트럭을 대여한 기록을 구하여 할인을 적용하고 대여기간에 대한 비용을 구하면 된다.

eg. ) HISTORY_ID 5번을 보면 CAR_ID는 3번 하루 대여비용은 32000 대여기간은 30일 트럭30일 이상 대여시 7%할인

=> 비용 * 날짜 * 할인율      

=> 32000 * 30 * 0.93 = 892,800

 


문제 풀이

생각 과정

DATEDIFF 함수를 이용하여 두 날짜의 차이를 구할 것이고 

할인율 적용기간은 7일이상, 30일이상, 90일이상으로 고정으로 정해져있기 때문에

CASE WHEN THEN 구문을 이용하여 구할 것이다.

서브쿼리를 REPLACE 함수를 이용하여 다음과 같이 작성하였다. 

SELECT DISCOUNT_RATE 
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN 
WHERE car_type = '트럭' AND REPLACE(duration_type,'일 이상','') = 7)

 

구현

SELECT 
  B.HISTORY_ID, 
  CASE 
  WHEN DATEDIFF(B.END_DATE, B.START_DATE) + 1 < 7 
  THEN A.DAILY_FEE * (DATEDIFF(B.END_DATE, B.START_DATE) + 1) 
  WHEN DATEDIFF(B.END_DATE, B.START_DATE) + 1 < 30 
  THEN ROUND(A.DAILY_FEE * (100 - (
        SELECT DISCOUNT_RATE 
        FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN 
        WHERE car_type = '트럭' AND REPLACE(duration_type, '일 이상', '') = 7
  		)) / 100 * (DATEDIFF(B.END_DATE, B.START_DATE)+ 1)) 
  WHEN DATEDIFF(B.END_DATE, B.START_DATE) + 1 < 90 
  THEN ROUND(A.DAILY_FEE * (100 - (
        SELECT DISCOUNT_RATE 
        FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN 
        WHERE car_type = '트럭' AND REPLACE(duration_type, '일 이상', '') = 30
		)) / 100 * (DATEDIFF(B.END_DATE, B.START_DATE)+ 1)) 
  ELSE ROUND(A.DAILY_FEE * (100 - (
        SELECT DISCOUNT_RATE 
        FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN 
        WHERE car_type = '트럭' AND REPLACE(duration_type, '일 이상', '') = 90
    	)) / 100 * (DATEDIFF(B.END_DATE, B.START_DATE)+ 1)) 
  END AS 'FEE' 
FROM 
  CAR_RENTAL_COMPANY_CAR A 
  JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B ON A.CAR_ID = B.CAR_ID 
WHERE A.CAR_TYPE = '트럭' 
ORDER BY FEE DESC, HISTORY_ID DESC;