본문 바로가기
공부/SQL

자동차 대여 기록 별 대여 금액 구하기

by shining park 2024. 10. 29.

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

 

프로그래머스

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

programmers.co.kr

 

- 나의 풀이

CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블을 조인하지 않고, 할인율 하드코딩

자동차 종류 별 대여 기간 종류 별 할인 정책 정보 테이블에서 할인율을 확인한 뒤 사용 (🚨문제 설명의 예시와 할인율 다름🚨)

따라서 7일 이상 0.95 , 30일 이상 0.92 , 90일 이상 0.85 을 곱해야 함

 

✅ 대여 기록 별 대여 금액 FEE ➡︎ DAILY_FEE * 할인율 * 대여날짜

FEE 정수부분만 출력 ➡︎ FLOOR( DAILY_FEE * 할인율 * 대여날짜 )

100 < SIZE_OF_COLONY <= 1000 (, and 로 범위 추가 해야함)

100 < SIZE_OF_COLONY and SIZE_OF_COLONY <= 1000

SIZE_OF_COLONY between 100 and 1000

 

 대여기간 구하기 ➡︎ DATEDIFF(대여 종료일, 대여 시작일) + 1

DATEDIFF ( datepart , startdate , enddate )

startdate 와 enddate 의 차이 단위 이름과 약어

 

- 나의 코드

/* 할인율 확인용
select DURATION_TYPE, DISCOUNT_RATE
from CAR_RENTAL_COMPANY_DISCOUNT_PLAN
where CAR_TYPE = '트럭';
*/

select A.HISTORY_ID
    , FLOOR(B.DAILY_FEE
            * (case when DATEDIFF(A.END_DATE, A.START_DATE)+1 >= 90 then 0.85
                   when DATEDIFF(A.END_DATE, A.START_DATE)+1 >= 30 then 0.92
                   when DATEDIFF(A.END_DATE, A.START_DATE)+1 >= 7 then 0.95
             else 1 end)
            * (DATEDIFF(A.END_DATE, A.START_DATE)+1)
    ) as FEE
from CAR_RENTAL_COMPANY_RENTAL_HISTORY A
inner join CAR_RENTAL_COMPANY_CAR B
on A.CAR_ID = B.CAR_ID
where B.CAR_TYPE = '트럭'
order by FEE desc, HISTORY_ID desc;

 

+

 

CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블 조인하여 풀이

 

- 다른 풀이 방식

select 
a.HISTORY_ID,
FLOOR(a.DAILY_FEE * ((100 - COALESCE(crcdp.DISCOUNT_RATE,0)) / 100) * (DATEDIFF(a.END_DATE, a.START_DATE) + 1)) as FEE
from 
(
select 
crcrh.HISTORY_ID, 
crcrh.START_DATE, 
crcrh.END_DATE, 
crcc.CAR_ID,
crcc.CAR_TYPE,
crcc.DAILY_FEE

from CAR_RENTAL_COMPANY_CAR crcc
inner join CAR_RENTAL_COMPANY_RENTAL_HISTORY crcrh
on crcc.CAR_ID = crcrh.CAR_ID 

where crcc.CAR_TYPE ='트럭'
) a

left join CAR_RENTAL_COMPANY_DISCOUNT_PLAN crcdp
on a.CAR_TYPE = crcdp.CAR_TYPE

and IF(DATEDIFF(a.END_DATE, a.START_DATE) + 1 BETWEEN 7 AND 30,'7일 이상',
  IF(DATEDIFF(a.END_DATE, a.START_DATE) + 1 BETWEEN 30 AND 90, '30일 이상',
  IF(DATEDIFF(a.END_DATE, a.START_DATE) + 1 >= 90, '90일 이상','-'))) = crcdp.DURATION_TYPE
order by FEE desc, HISTORY_ID desc;