728x90
❓ Question
❗ Answer
SELECT d.history_id, ROUND(d.duration*d.daily_fee*(100-IFNULL(p.discount_rate,0))/100) fee
FROM (SELECT r.history_id, r.car_id, r.daily_fee, r.duration, r.car_type,
(CASE WHEN r.duration < 7 THEN NULL
WHEN r.duration BETWEEN 7 AND 29 THEN '7일 이상'
WHEN r.duration BETWEEN 30 AND 89 THEN '30일 이상'
ELSE '90일 이상'
END) duration_type
FROM (SELECT h.history_id, c.car_id, c.car_type, c.daily_fee, DATEDIFF(h.end_date, h.start_date)+1 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 = '트럭'
) r
) d
LEFT OUTER JOIN car_rental_company_discount_plan p
ON d.duration_type = p.duration_type AND d.car_type = p.car_type
ORDER BY fee DESC, history_id DESC;
📌 Discussion
- 첫번째 sub query
- history의 car_id에 대해 대여기간을 추출
- 차종이 트럭인 레코드만 필터링 - 두번째 sub query
- 첫번째 sub query inline view 테이블에서 대여기간에 따른 분류를 진행 - main query
- 각 대여기간 분류에 따른 일별 대여요금 계산
- LEFT OUTER JOIN으로 대여기간 분류가 NULL로 된 레코드도 추출
- history 테이블의 duration_type에는 여러 차종이 있기에 JOIN KEY를 대여기간 분류와 차종을 모두 지정
- IFNULL을 써서 대여기간 분류가 안된 레코드는 할인률 0으로 적용
'SQL 문제풀이' 카테고리의 다른 글
[해커랭크 SQL] Basic Select - Revising the Select Query I (0) | 2023.08.15 |
---|---|
[프로그래머스 SQL] LV.5 상품을 구매한 회원 비율 구하기 (0) | 2023.08.12 |
[프로그래머스 SQL] LV.4 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2023.08.12 |
[프로그래머스 SQL] LV.1 조건에 부합하는 중고거래 댓글 조회하기 (0) | 2023.08.12 |
[프로그래머스 SQL] LV.4 입양 시각 구하기(2) (0) | 2023.08.11 |