코딩테스트 준비/SQL문법

[프로그래머스 LV4] - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(join) SQL

SeoburiFaust 2024. 2. 17. 01:20

문제

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

 

프로그래머스

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

programmers.co.kr

접근방법

복잡한 문제였다. 여태 푼 sql문제 중 가장 오래걸렸다.

 

처음 접근 할 때, natural join을 이용해서 풀려고 해봤는데, 잘 안 됐다.

 

또 discount_rate이 문자열 데이터인 줄 착각해서 좀 헤메기도 했다.

문제를 다시보니 정수 데이터였다.

다음부턴 문제를 잘 봐야겠다.

 

그래서 다른 사람 풀이를 참고했다.

from 문에서 join하기 전에 subquery를 만들어 해결하는 것을 보고 영감을 받았다.

 

코드

select car_id, car_type, floor(daily_fee * 30 * (1 - discount_rate/100)) as fee
from (select *
     from car_rental_company_car
     where car_type in ('세단', 'SUV')
     and car_id not in 
     (select car_id
    from car_rental_company_rental_history
    where start_date <= '2022-11-30' and end_date >= '2022-11-1')) as A
join (select *
     from car_rental_company_discount_plan
     where duration_type = '30일 이상'
     ) as B using(car_type)  
where daily_fee * 30 * (1 - discount_rate/100) between 500000 and 1999999
order by fee desc, car_type, car_id desc

개선할 점

기억해야 할 것.

 

1. floor : 소수점을 지워 정수로 만들어 준다. 유용할 것 같다.

2. 대여 가능한 car_id를 찾기 위해 start_date와 end_date가 해당 범위와 곂치는 지 알아야 하는데,

여기서 부등호를 착각하기 쉽다.

다음부턴 이 점을 유의하자.

3. from에서 subquery를 만들어 놓는 것이 편리할 때가 있다.