본문 바로가기
PS/SQL

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

by 행복한라이언 2024. 2. 15.
728x90
반응형

문제링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 핵심

  • CASE-WHEN 사용
  • IF문 사용
    • IF(condition, true일 때 value, false일 때 value)
  • TIMESTAMPDIFF
    • TIMESTAMPDIFF(단위, 시작일, 끝일)
  • 해설
    • temp는 CAR_RENTAL_COMPANY와 CAR_RENTAL_COMPANY_HISTORY를 inner join하고 '트럭'만 필터링한 후에DURATION_TYPE과 TOTAL_FEE를 계산한다.
    • FEE를 계산할 때는 temp 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에 대해서 left outer join을 진행했다. 
      • inner join을 진행하면 DURATION_TYPE에 대해서 7일이상, 30일이상, 90일 이상만 판단하고 7일 이하에 대해서는 계산하지 않는다. 문제는 temp 테이블에는 엄연히 7일 이하의 DURATION_TYPE도 존재해야하므로 temp기준 left join을 한다.
      • 그렇게 되면 CAR_RENTAL_COMPANY_DISCOUNT_PLAN에는 7일이하가 존재하지 않으므로 join된 테이블에는 null값이 있을 것이다.
      • 그래서 if(P.DURATION_TYPE is null, 0, P.DISCOUNT_RATE) 문을 사용해서 적절한 DISCOUNT_RATE를 가져오도록 했다.

2. 코드(MySQL)

# 자동차의 종류 - 트럭 / 대여기록 별로 대여금액 > 대여 기록id, 대여금액 리스트 출력
# 대여금액 기준 내림차순 / 기록id 내림차순

with temp as (
    select H.HISTORY_ID,
        case
            when timestampdiff(day, H.START_DATE, H.END_DATE) < 7 then null
            when timestampdiff(day, H.START_DATE, H.END_DATE) < 30 then '7일 이상'
            when timestampdiff(day, H.START_DATE, H.END_DATE) < 90 then '30일 이상'
            else '90일 이상'
        end as DURATION_TYPE,
        C.DAILY_FEE * (timestampdiff(day, H.START_DATE, H.END_DATE) + 1) as TOTAL_FEE,
        C.CAR_TYPE
    from CAR_RENTAL_COMPANY_CAR C
    inner join CAR_RENTAL_COMPANY_RENTAL_HISTORY H on C.CAR_ID = H.CAR_ID
    where C.CAR_TYPE = '트럭'
)

select T.HISTORY_ID,
    round(T.TOTAL_FEE * ((100 - if(P.DURATION_TYPE is null, 0, P.DISCOUNT_RATE)) / 100), 0)
        as FEE
from temp T
left join CAR_RENTAL_COMPANY_DISCOUNT_PLAN P 
        on T.CAR_TYPE = P.CAR_TYPE and T.DURATION_TYPE = P.DURATION_TYPE
order by FEE desc, T.HISTORY_ID desc;
728x90
반응형