본문 바로가기
PS/SQL

[SQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

by 행복한라이언 2024. 2. 11.
728x90
반응형

문제링크

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

 

프로그래머스

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

programmers.co.kr

1. 핵심

  • temp 
    • 대여 가능한 car_id를 추출한다
    • 그런데 car_id는 중복해서 나오게 되므로 car_id로 group by 진행하고 max 집계함수로 가장 최근 END_DATE를 가져온다.
    • 그후 having문을 통해서 2022 보다 작거나 같고 10월보다 작거나 같은, 즉 대여기간에 대여할 수 있는 것을 필터링한다.
  • temp2
    • temp과 CAR_RENTAL_COMPANY_CAR를 inner join하여 대여가능한 car_id 중에서 car_type이 'SUV'와 '세단'인 것을 추출한다.
  • temp3
    • temp2와 CAR_RENTAL_COMPANY_DISCOUNT_PLAN을 inner join하는데 두 테이블은 car_type으로 조인하도록한다.
    • 30일 이상 대여이므로 DURATION_TYPE = '30일 이상'으로 한 후에 계산한다.
    • 할인된 금액은 DAYILY_FEE * 30 * (100 - DISCOUNT) / 100으로  하며 정수로 나와야 하기 때문에 round( ~, 0) 함수를 사용했다.
    • 왜 100- DISCOUNT를 하냐면...DISCOUNT은 할인정도이다. 그리고 컬럼을 찍어보면 정수 8, 12 이렇게 나온다. 그렇기 때문에 저렇게 계산을 했다.
728x90

2. 코드(MySQL)

# 자동차의 종류 - 세단, suv
# 2022년 11월 1일 ~ 2022년 11월 30일까지 대여 가능
# 30일간의 대여금액이 50만원 이상, 200만원 미만만 출력!
# 대여금액 내림차순, 자동차 종류 오름차순, 자동차id 내림차순
# history에서 car_id 중복이 존재 > end_date가 가장 큰 것만 나오도록!

# temp - [2022-11-01 ~ 2022-11-30]에 대여가능한 CAR_ID 추출
# car_id가 중복된 존재..그래서 max집계 함수 사용해서 가장 최근 날짜만 추출
with temp as (
    select CAR_ID, max(END_DATE) as END_DATE
    from CAR_RENTAL_COMPANY_RENTAL_HISTORY 
    group by CAR_ID
    having year(max(END_DATE)) <= 2022 and month(max(END_DATE)) <= 10
),
# temp2 대여가능한 것 중에서 CAR_TYPE이 SUV와 세단인 CAR의 CAR_ID, TYPE, DAILY_FEE
temp2 as (
    select T.CAR_ID, C.CAR_TYPE, C.DAILY_FEE
    from temp T
    inner join CAR_RENTAL_COMPANY_CAR C on T.CAR_ID = C.CAR_ID
    where C.CAR_TYPE in ('SUV', '세단')
),
# temp3 대여가능한 SUV, 세단의 할인률을 구하기 위해서 join한 후에 계산
temp3 as (
    select T2.CAR_ID, T2.CAR_TYPE,
            round(T2.DAILY_FEE * 30 * (100 - P.DISCOUNT_RATE) / 100, 0) as FEE
    from temp2 T2
    inner join CAR_RENTAL_COMPANY_DISCOUNT_PLAN P on T2.CAR_TYPE = P.CAR_TYPE
    where  P.DURATION_TYPE = '30일 이상'
)

# 50만원 이상, 200만원 미만 출력
select CAR_ID, CAR_TYPE, FEE
from temp3
where FEE between 500000 and 1999999
order by FEE desc, CAR_TYPE asc, CAR_ID desc;
728x90
반응형