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

장우솔·2023년 9월 10일
1

알고리즘

목록 보기
21/21

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

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

문제 푸는 순서

  1. CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 행만 따로 구하기
  2. 실제 이용 날짜 계산하기
  3. 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하기.
  • DAILY_FEE대여날짜(end_date-start_date)+1할인율(7일 미만은 할인x)
  1. 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬

정답

WITH value AS (
    SELECT car.daily_fee, car.car_type, his.history_id,
           DATEDIFF(end_date, start_date) + 1 AS period,
    CASE 
      WHEN DATEDIFF(end_date, start_date) + 1 >= 90 THEN '90일 이상'
      WHEN DATEDIFF(end_date, start_date) + 1 >= 30 THEN '30일 이상'
      WHEN DATEDIFF(end_date, start_date) + 1 >= 7 THEN '7일 이상'
      ELSE 'NONE' END AS duration_type
FROM car_rental_company_rental_history AS his
INNER JOIN car_rental_company_car AS car ON car.car_id = his.car_id
WHERE car.car_type = '트럭')   



SELECT value.history_id, 
    ROUND(value.daily_fee * value.period * 
          (100 - IFNULL(plan.discount_rate,0)) / 100) AS FEE
FROM value
LEFT JOIN car_rental_company_discount_plan AS plan 
    ON plan.duration_type = value.duration_type 
    AND plan.car_type = value.car_type
ORDER BY 2 DESC, 1 DESC
  • with절
    하나 이상의 서브쿼리에서 반환된 데이터를 단일 쿼리에서 재사용할 수 있다. 코드 중복을 줄이고 쿼리의 가독성을 향상시키는 데 도움이 된다!

  • Join 2개
    on 뒤에 and로 여러 행을 조인 조건으로 둘 수 있다.

profile
공부한 것들을 정리하는 블로그

0개의 댓글