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

수이·4일 전
0

🟢 코드카타 / SQL

목록 보기
75/81

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

조건정리

  1. 트럭 대여 기록별로 대여금액 구하기 > FEE
  2. 대여 금액 기준 내림차순, 대여 기록ID 기준 내림차순 정렬

풀이
1. 트럭 렌탈 요금, 대여기록ID, 대여일수, 대여기간 구하기
2. 트럭 할인률 구하기
3. 두개를 조인!

WITH truck_duration AS (
    SELECT c.daily_fee, 
           h.history_id, 
           DATEDIFF(h.end_date, h.start_date) + 1 AS rental_days, 
           CASE WHEN DATEDIFF(h.end_date, h.start_date)+1 >= 90 THEN '90일 이상'
                WHEN DATEDIFF(h.end_date, h.start_date)+1 >= 30 THEN '30일 이상'
                WHEN DATEDIFF(h.end_date, h.start_date)+1 >= 7 THEN '7일 이상'
                ELSE NULL 
                END AS duration 
    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 = '트럭'
),
truck_dc_rate AS 
(
    SELECT duration_type, discount_rate
    FROM car_rental_company_discount_plan
    WHERE car_type = '트럭')

SELECT d.history_id, 
       FLOOR(d.daily_fee * d.rental_days * (100 - COALESCE(r.discount_rate, 0)) / 100)AS FEE
FROM truck_duration d
LEFT JOIN truck_dc_rate r ON d.duration = r.duration_type 
ORDER BY FEE desc, d.history_id desc

다른사람 풀이

SELECT HISTORY_ID, ROUND(DIFF*DAILY_FEE*((100-IFNULL(DISCOUNT_RATE, 0))/100), 0) AS FEE 
FROM (
    SELECT HISTORY_ID, A.CAR_ID, CAR_TYPE,
        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 NULL
        END AS DURATION_TYPE, DATEDIFF(END_DATE, START_DATE)+1 AS DIFF, DAILY_FEE
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A
    LEFT JOIN CAR_RENTAL_COMPANY_CAR B ON A.CAR_ID = B.CAR_ID
    WHERE CAR_TYPE = '트럭'
    ) H
LEFT JOIN (
    SELECT DURATION_TYPE, DISCOUNT_RATE
    FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
    WHERE CAR_TYPE = '트럭'
) D ON H.DURATION_TYPE = D.DURATION_TYPE
ORDER BY FEE DESC, HISTORY_ID DESC

이건 생각보다 쉽게 풀었다 와하하
로직은 같지만 서브쿼리로 푼 풀이도 있어서 가져와 봄
나는 그냥 CTE로 정리하면서 푸는 게 편한 것 같다!

0개의 댓글

관련 채용 정보