본문 바로가기
문제풀이/SQL(Oracle)

[문제풀이] 자동차 대여 기록 별 대여 금액 구하기

by kime2 2024. 3. 20.

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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

문제에 대한 해석

-- 조건1: 자동차 종류가 '트럭'
-- 조회: 기록 ID, 대여 금액 FEE -> (end-start+1)*daily_fee*(기간에 맞는 할인율)
-- 정렬: 금액 - 내림차순, 기록ID - 내림

 

풀이(ORACLE)

with temp as 
    (SELECT CAR_TYPE, history_id, daily_fee, (end_date-start_date+1) as duration
    from CAR_RENTAL_COMPANY_CAR a join CAR_RENTAL_COMPANY_RENTAL_HISTORY b
    on a.car_id = b.car_id
    where CAR_TYPE = '트럭'),
    temp2 as (select car_type, history_id, duration, daily_fee,
    case when duration < 7 then '할인없음'
        when duration between 7 and 30-1 then '7일 이상'
         when duration between 30 and 90-1 then '30일 이상'
         when duration >= 90 then '90일 이상' end as period
    from temp)

select history_id,
  NVL(daily_fee*duration*(1-discount_rate/100), daily_fee*duration) as FEE
from temp2 c left join CAR_RENTAL_COMPANY_DISCOUNT_PLAN d
on c.car_type = d.car_type and c.period = d.duration_type
order by fee desc, history_id desc

 

 

다른사람 풀이

WITH TMP AS (
    SELECT H.HISTORY_ID
        , C.CAR_TYPE
        , C.DAILY_FEE
        , (CASE 
            WHEN (H.END_DATE - H.START_DATE)+1 < 7 THEN NULL
            WHEN (H.END_DATE - H.START_DATE)+1 < 30 THEN '7일 이상'
            WHEN (H.END_DATE - H.START_DATE)+1 < 90 THEN '30일 이상'
            ELSE '90일 이상' END 
        ) DISCOUNT_TYPE
        , (H.END_DATE - H.START_DATE)+1 PERIOD
    FROM CAR_RENTAL_COMPANY_CAR C
    JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H
    ON C.CAR_ID = H.CAR_ID
    WHERE C.CAR_TYPE = '트럭'
)

SELECT T.HISTORY_ID
    , TRUNC((T.DAILY_FEE * PERIOD) / 100 * (100 - NVL(P.DISCOUNT_RATE,0))) FEE
FROM TMP T
LEFT OUTER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P
ON T.DISCOUNT_TYPE = P.DURATION_TYPE
    AND T.CAR_TYPE = P.CAR_TYPE
ORDER BY FEE DESC, HISTORY_ID DESC