CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
문제링크
조건정리
FEE
풀이
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로 정리하면서 푸는 게 편한 것 같다!