본문 바로가기
Exercises 🤓/SQL

[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기 - MySQL

by 째파 2023. 1. 16.
반응형

이직 후 데이터 테이블을 직접 조회하고 생성할 일이 많이 생겨서 SQL을 다시 사용해야 했다.

하지만 현업에서 사용한 지 시간이 좀 지났고 이직준비한 지도 꽤 되어 코테로 연습하기로 했다.

코딩테스트를 준비하면서 풀었던 프로그래머스에 마침 새로운 SQL문제가 나와서 우선 풀어보았다.

 


 

🤔 문제

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

 

프로그래머스

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

programmers.co.kr

MySQL, ORACLE SQL로 풀 수 있는 문제이고 난이도는 Lv.4이다.

테이블이 3가지가 나오고 테이블 명이 길어서 풀기에 유쾌한 문제는 아니었다.

그리고 아직 문제가 나온 지 얼마 되지 않아서 문제 완료한 사람이 별로 없었다.

 

😄 나의 풀이

WITH TRUCK_RENT_FEE AS(
SELECT HISTORY_ID, DATEDIFF(END_DATE, START_DATE)+1 AS RENT_DAYS
    , CASE WHEN DATEDIFF(END_DATE, START_DATE)+1 < 7 THEN '할인 정책 없음'
    WHEN DATEDIFF(END_DATE, START_DATE)+1 >=7 AND DATEDIFF(END_DATE, START_DATE)+1 < 30 THEN '7일 이상'
    WHEN DATEDIFF(END_DATE, START_DATE)+1 >=30 AND DATEDIFF(END_DATE, START_DATE)+1 < 90 THEN '30일 이상'
    ELSE '90일 이상' END AS DURATION_TYPE
    , DAILY_FEE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A
JOIN CAR_RENTAL_COMPANY_CAR B ON A.CAR_ID = B.CAR_ID
WHERE CAR_TYPE = '트럭'
)
SELECT HISTORY_ID, ROUND(DAILY_FEE*(100-COALESCE(DISCOUNT_RATE, 0))*0.01*RENT_DAYS) AS FEE 
FROM TRUCK_RENT_FEE T
LEFT JOIN (SELECT DURATION_TYPE, DISCOUNT_RATE
           FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
           WHERE CAR_TYPE = '트럭'
           ) TRUCK_DISCOUNT ON T.DURATION_TYPE = TRUCK_DISCOUNT.DURATION_TYPE
ORDER BY FEE DESC, HISTORY_ID DESC

어느 순간부터 쿼리의 유지보수하기에는 WITH문을 사용하는 것이 편하고 보기 좋아서 WITH문을 사용했다.

먼저 TRUCK_RENT_FEE라는 임시 테이블을 만들어 자동차 대여 이력별 대여기간과 일일금액을 정리했고 나중에 할인율을 곱해 대여금액 FEE를 구했다.

여기서 주의해야할 점은 대여기간을 구할 때에 date 타입인 END_DATE와 START_DATE를 그냥 빼주는 것이 아니라 DATEDIFF()를 사용해야한다는 것! 처음에 그냥 뺐다가 엄한 숫자가 나와서 틀렸었다...😅

 

종종 문제풀어보는것도 재밌는 것 같다.

반응형

댓글