링크
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를 기준으로 내림차순 정렬해주세요.
정답
select history_id,
round(daily_fee * (datediff(end_date, start_date) + 1) * (100 - ifnull(discount_rate, 0)) /
100, 0) fee
from (
select *,
case when datediff(end_date + 1, start_date) < 7 then null
when datediff(end_date + 1, start_date) < 30 then '7일 이상'
when datediff(end_date + 1, start_date) < 90 then '30일 이상'
else '90일 이상'
end as duration_date
from car_rental_company_rental_history
) a
join car_rental_company_car b
on a.car_id = b.car_id
left join car_rental_company_discount_plan c
on c.car_type = b.car_type and c.duration_type = a.duration_date
where b.car_type = '트럭'
order by 2 desc, 1 desc
해설
- 우선 실제 차량 대여 기간이 discount_plan과 동일한 컬럼을 만든다.
- 일일 대여금액과 실제 차량 대여 기간이 한 테이블에 있도록 조인한다.
- 할인 비율이 한 테이블에 있도록 다시 조인한다. 이때 자동차 타입과 대여 기간이 같아야 한다.
새롭게 이해한 내용
- 최종 구하고자 하는 값을 구하려면 최종 테이블의 형태가 어떠해야 하는지 머릿속으로 그린다.
- 그 결과가 나오도록 쿼리를 구상한다.
'[업무 지식] > MySQL' 카테고리의 다른 글
[NULL] Find Customer Referee (0) | 2024.10.23 |
---|---|
상품을 구매한 회원 비율 구하기 (0) | 2024.10.22 |
[기간에 포함되지 않는 날짜] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2024.10.18 |
[WITH 구문] 임시 테이블 생성 (0) | 2024.10.16 |
[with 구문] 입양 시각 구하기(2) (0) | 2024.10.16 |