PS/SQL
[SQL] 자동차 대여 기록 별 대여 금액 구하기
행복한라이언
2024. 2. 15. 17:02
728x90
반응형
문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/151141
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 핵심
- CASE-WHEN 사용
- IF문 사용
- IF(condition, true일 때 value, false일 때 value)
- TIMESTAMPDIFF
- TIMESTAMPDIFF(단위, 시작일, 끝일)
- 해설
- temp는 CAR_RENTAL_COMPANY와 CAR_RENTAL_COMPANY_HISTORY를 inner join하고 '트럭'만 필터링한 후에DURATION_TYPE과 TOTAL_FEE를 계산한다.
- FEE를 계산할 때는 temp 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에 대해서 left outer join을 진행했다.
- inner join을 진행하면 DURATION_TYPE에 대해서 7일이상, 30일이상, 90일 이상만 판단하고 7일 이하에 대해서는 계산하지 않는다. 문제는 temp 테이블에는 엄연히 7일 이하의 DURATION_TYPE도 존재해야하므로 temp기준 left join을 한다.
- 그렇게 되면 CAR_RENTAL_COMPANY_DISCOUNT_PLAN에는 7일이하가 존재하지 않으므로 join된 테이블에는 null값이 있을 것이다.
- 그래서 if(P.DURATION_TYPE is null, 0, P.DISCOUNT_RATE) 문을 사용해서 적절한 DISCOUNT_RATE를 가져오도록 했다.
2. 코드(MySQL)
# 자동차의 종류 - 트럭 / 대여기록 별로 대여금액 > 대여 기록id, 대여금액 리스트 출력
# 대여금액 기준 내림차순 / 기록id 내림차순
with temp as (
select H.HISTORY_ID,
case
when timestampdiff(day, H.START_DATE, H.END_DATE) < 7 then null
when timestampdiff(day, H.START_DATE, H.END_DATE) < 30 then '7일 이상'
when timestampdiff(day, H.START_DATE, H.END_DATE) < 90 then '30일 이상'
else '90일 이상'
end as DURATION_TYPE,
C.DAILY_FEE * (timestampdiff(day, H.START_DATE, H.END_DATE) + 1) as TOTAL_FEE,
C.CAR_TYPE
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 = '트럭'
)
select T.HISTORY_ID,
round(T.TOTAL_FEE * ((100 - if(P.DURATION_TYPE is null, 0, P.DISCOUNT_RATE)) / 100), 0)
as FEE
from temp T
left join CAR_RENTAL_COMPANY_DISCOUNT_PLAN P
on T.CAR_TYPE = P.CAR_TYPE and T.DURATION_TYPE = P.DURATION_TYPE
order by FEE desc, T.HISTORY_ID desc;
728x90
반응형