본문 바로가기
[업무 지식]/MySQL

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

by 에디터 윤슬 2024. 10. 21.
 

링크

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

 

프로그래머스

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

programmers.co.kr

 

문제

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

정답

select history_id,
        round(daily_fee * (datediff(end_date, start_date) + 1) * (100 - ifnull(discount_rate, 0)) /
             100, 0) fee
from (
    select *,
            case when datediff(end_date + 1, start_date) < 7 then null
                when datediff(end_date + 1, start_date) < 30 then '7일 이상'
                when datediff(end_date + 1, start_date) < 90 then '30일 이상'
                else '90일 이상'
                end as duration_date
    from car_rental_company_rental_history
    ) a
    join car_rental_company_car b
    on a.car_id = b.car_id
    left join car_rental_company_discount_plan c
    on c.car_type = b.car_type and c.duration_type = a.duration_date
where b.car_type = '트럭'
order by 2 desc, 1 desc

해설

  • 우선 실제 차량 대여 기간이 discount_plan과 동일한 컬럼을 만든다.
  • 일일 대여금액과 실제 차량 대여 기간이 한 테이블에 있도록 조인한다.
  • 할인 비율이 한 테이블에 있도록 다시 조인한다. 이때 자동차 타입과 대여 기간이 같아야 한다.

새롭게 이해한 내용

  • 최종 구하고자 하는 값을 구하려면 최종 테이블의 형태가 어떠해야 하는지 머릿속으로 그린다.
  • 그 결과가 나오도록 쿼리를 구상한다.