[프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기
https://school.programmers.co.kr/learn/courses/30/lessons/157339
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
어렵다...
1. 자동차 종류가 '세단' or 'SUV'
SELECT *
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h
LEFT JOIN CAR_RENTAL_COMPANY_CAR c ON h.car_id = c.car_id
WHERE car_type = '세단' OR car_type = 'SUV'
2. 2022-11-01 ~ 2022-11-30 까지 대여 가능하기 위해서는
1) start_date가 11-01 이전 --> end_date가 11-01 이전
SELECT h.car_id,
MAX(end_date)
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h
LEFT JOIN CAR_RENTAL_COMPANY_CAR c ON h.car_id = c.car_id
WHERE car_type = '세단' OR car_type = 'SUV'
AND start_date < '2022-11-01'
GROUP BY h.car_id
HAVING MAX(end_date) <'2022-11-01'
2) start_date가 11월이면 X
SELECT car_id
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h
WHERE car_id IN (
SELECT h.car_id
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h
LEFT JOIN CAR_RENTAL_COMPANY_CAR c ON h.car_id = c.car_id
WHERE car_type = '세단' OR car_type = 'SUV'
AND start_date < '2022-11-01'
GROUP BY h.car_id
HAVING MAX(end_date) <'2022-11-01')
AND MONTH(start_date) != 11
GROUP BY car_id
이렇게 출력된 차량들은 2022-11-01 ~ 2022-11-30 대여 가능한 차량이다.
3. 대여 금액 정보
SELECT h.car_id,
c.car_type,
FLOOR(c.daily_fee * (100-discount_rate)/100 * 30) AS FEE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h
LEFT JOIN CAR_RENTAL_COMPANY_CAR c ON h.car_id = c.car_id
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN d ON c.car_type = d.car_type
WHERE h.car_id IN (
SELECT h.car_id
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h
LEFT JOIN CAR_RENTAL_COMPANY_CAR c ON h.car_id = c.car_id
WHERE car_type = '세단' OR car_type = 'SUV'
AND start_date < '2022-11-01'
GROUP BY h.car_id
HAVING MAX(end_date) <'2022-11-01')
AND MONTH(start_date) != 11
AND duration_type = '30일 이상'
GROUP BY h.car_id
HAVING FEE >= 500000 AND FEE < 2000000
ORDER BY FEE DESC, car_type, car_id DESC
이렇게 하면 정답이다...
당연히 틀릴줄 알았는데! 맞아서 기분은 좋았다 흐흐
그치만 엄청 비효율적인 풀이로 보여서 ... 다른 분들의 풀이를 찾아보았다.
[SQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(프로그래머스/MySQL/Level 4)
안녕하세요! 데코입니다! 오늘은 프로그래머스 코딩테스트 연습에 있는 "특정 기간동안 대여 가능한 자동차들의 대여비용 구하기" 문제를 포스팅하려고 합니다! 바로 포스팅 시작할게요! :) (출
kkw-da.tistory.com
[프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기
CAR_RENTAL_COMPANY_CAR 테이블CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블이 다음과 같다면자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일
velog.io
2022-11-01 부터 2022-11-30 내에 대여 가능한 차량을 구하지 않고, 대여가 불가능한 차량 ID를 구한 후 NOT IN 조건을 사용해주는 방식이었다.
해당 기간동안 대여가 불가능한 경우는 3가지이다.
SELECT car_id
FROM car_rental_company_rental_history
WHERE start_date > '2022-11-30'
AND end_date > '2022-11-01'
이 외의 부분은 비슷하다.
SELECT c.car_id AS car_id,
c.car_type AS car_type,
ROUND(c.daily_fee * 30 * (100 - d.discount rate) / 100) AS FEE
FROM car_rental_company_car AS c
LEFT JOIN car_company_discount_plan AS d ON c.car_type = d.car_type
LEFT JOIN car_rental_company_rental_history AS h ON c.car_id = h.car_id
WHERE c.car_id NOT IN (
SELECT car_id
FROM car_rental_company_rental_history
WHERE start_date > '2022-11-30'
AND end_date > '2022-11-01'
) AND d.duration_type LIKE '30%' -- 대여기간 30일 이상
GROUP BY c.car_id
HAVING c.car_type IN ('세단', 'SUV')
AND (FEE >= 500000 AND FEE < 200000)
ORDER BYT FEE DESC, car_type, car_id DESC