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

Ga0·2023년 5월 28일
0

programmers

목록 보기
14/14

자동차 대여 기록 별 대여 금액 구하기 (String,date - LEVEL4)

예시

CAR_RENTAL_COMPANY_CAR 테이블

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블

CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블

자동차 종류가 '트럭' 인 자동차의 대여 기록에 대해서 대여 기간을 구하면,

  • 대여 기록 ID가 1인 경우, 7일

  • 대여 기록 ID가 2인 경우, 2일

  • 대여 기록 ID가 5인 경우, 30일

  • 대여 기간 별로 일일 대여 요금에 알맞은 할인율을 곱하여 금액을 구하면 다음과 같다.

  • 대여 기록 ID가 1인 경우, 일일 대여 금액 26,000원에서 5% 할인율을 적용하고 7일을 곱하면 총 대여 금액은 172,900원

  • 대여 기록 ID가 2인 경우, 일일 대여 금액 26,000원에 2일을 곱하면 총 대여 금액은 52,000원

  • 대여 기록 ID가 5인 경우, 일일 대여 금액 32,000원에서 7% 할인율을 적용하고 30일을 곱하면 총 대여 금액은 892,800원이 되므로, 대여 금액을 기준으로 내림차순 정렬 및 대여 기록 ID를 기준으로 내림차순 정렬하면 다음과 같아야 한다.

SQL 실행 결과는 다음과 같다.

SQL문 - MySQL

SELECT H.HISTORY_ID, -- 대여 기록 ID
    -- 지불해야하는 비율까지 구했다면 일일 대여 요금 x (끝난 날짜 - 시작 날짜)+1 = 이용기간 => 대여 금액 
    -- 단 소수점은 다 버린다.
    round(DAILY_FEE * (DATEDIFF(H.END_DATE,H.START_DATE)+1) * 
          (1 - ( -- 1 - (구한 비율을 100으로 나눈 값)을 하면 비용을 지불해야하는 비율이다.
          CASE WHEN DATEDIFF(H.END_DATE,H.START_DATE)+1 >= 90  -- 90일 이상일 경우
                THEN (SELECT DISCOUNT_RATE  -- CAR_RENTAL_COMPANY_DISCOUNT_PLAN테이블에서 할인비율
                        FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN SP
                      -- CAR_RENTAL_COMPANY_CAR의 차종류와 CAR_RENTAL_COMPANY_DISCOUNT_PLAN의 차 종류가 같고
                     WHERE C.CAR_TYPE = SP.CAR_TYPE 
                        and DURATION_TYPE = '90일 이상')/100 -- 대여 기간이 90일 이상인 것
                    -- 의 비율을 100으로 나눈 후 
              -- CASE ~ WHEN ~ END의 내용은 위와 같은 내용이다.
               WHEN DATEDIFF(H.END_DATE,H.START_DATE)+1 >= 30 
                THEN (SELECT DISCOUNT_RATE 
                        FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN SP
                     WHERE C.CAR_TYPE = SP.CAR_TYPE and DURATION_TYPE = '30일 이상')/100
               WHEN DATEDIFF(H.END_DATE,H.START_DATE)+1 >= 7 
                THEN (SELECT DISCOUNT_RATE 
                        FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN SP
                     WHERE C.CAR_TYPE = SP.CAR_TYPE and  DURATION_TYPE = '7일 이상')/100
               ELSE 0 -- 90, 30, 7일 이상이 아닐 경우는 1 - 0 = 할인이 없다는 것
               END ))) FEE
    from CAR_RENTAL_COMPANY_CAR as C
        join CAR_RENTAL_COMPANY_RENTAL_HISTORY as H
            -- CAR_RENTAL_COMPANY_RENTAL_HISTORY의 테이블의 차 ID와 CAR_RENTAL_COMPANY_CAR의 차 ID를 기준으로 연결
            on C.CAR_ID = H.CAR_ID 
WHERE C.car_type = "트럭" -- 차 종류가 트럭인 경우만
GROUP BY H.HISTORY_ID -- 대여 기록 ID로 그룹화
ORDER BY FEE DESC , H.HISTORY_ID DESC
  • 문제 중에 가장 어렵게 느껴진 문제였는데 CASE문 안에서 SELECT를 쓰는 구조를 생각해내지 못해서 발생한 어려움이었다.

0개의 댓글