문제
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: 자동차 종류가 '트럭'
-- 조회: 기록 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
'문제풀이 > SQL(Oracle)' 카테고리의 다른 글
입양 시각 구하기(2) (0) | 2024.03.22 |
---|---|
상품을 구매한 회원 비율 구하기 - 작동순서 추가하기 (0) | 2024.03.21 |
[문제풀이] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2024.03.20 |
[문제풀이] DATETIME에서 DATE로 형 변환 (0) | 2024.02.01 |
[문제풀이] NULL 처리하기/경기도에 위치한 식품창고 목록 출력하기 (0) | 2024.02.01 |