[programmers/MySQL] 자동차 대여 기록 별 대여 금액 구하기

songeunm·2025년 4월 3일

PS - sql

목록 보기
55/58
post-thumbnail

문제

✔️ Lv. 4

문제 흐름

살짝 고민했지만 길어지는 코드에서 집중만 잘 이어간다면 어려울 건 없는 문제였다.
대신 요즘 자주 안봐서 그런지 이상한 곳에서 문법 실수를 꽤나 했다.


WITH를 이용한다면 좀더 논리적으로 쉽게 접근할 수 있다.

자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요.

대여 기록 별로 구해야하므로 베이스 테이블은 car_rental_company_rental_history가 되겠다. fee를 구하는 데 필요한 건 세가지다.

  1. daily_fee
  2. start_date, end_date
  3. discount_rate

근데 각각은 모두 다른 테이블에 있다.
1과 2를 연결하는 건 car_id이고, 2와 3을 연결하는 건 2의 두 컬럼의 차이다.
두 날짜간 차이는 datediff 함수를 통해 구할 수 있다.
차례로 연결지어주면 쉽게 이해가 된다.
다만 2와 3을 연결할 때에는 JOIN이 아니라 CASE를 사용했다.

나의 경우 총 두가지 CTE를 생성했고, 메인 쿼리에서는 fee의 계산만 실행하도록 했다.

코드

WITH fee_and_days AS (
SELECT
    history_id,
    daily_fee,
    datediff(end_date, start_date) + 1 days
FROM car_rental_company_rental_history h
JOIN car_rental_company_car c ON h.car_id = c.car_id
AND car_type = "트럭"
), fee_and_days_and_discount AS (
SELECT *,
    CASE WHEN days >= 90
    THEN (SELECT discount_rate FROM car_rental_company_discount_plan WHERE car_type="트럭" AND duration_type = "90일 이상")
    WHEN days >= 30
    THEN (SELECT discount_rate FROM car_rental_company_discount_plan WHERE car_type="트럭" AND duration_type = "30일 이상")
    WHEN days >= 7
    THEN (SELECT discount_rate FROM car_rental_company_discount_plan WHERE car_type="트럭" AND duration_type = "7일 이상")
    ELSE 0 END as discount
FROM fee_and_days
)

SELECT
    history_id,
    round(daily_fee * days * (100-discount) / 100) fee
FROM fee_and_days_and_discount
ORDER BY 2 DESC, 1 DESC;
profile
데굴데굴 구르는 개발자 지망생

0개의 댓글