SQL/문제풀이

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

응엉잉 2024. 1. 9. 15:20

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

 

이렇게 하면 정답이다...

당연히 틀릴줄 알았는데! 맞아서 기분은 좋았다 흐흐

그치만 엄청 비효율적인 풀이로 보여서 ... 다른 분들의 풀이를 찾아보았다.

https://kkw-da.tistory.com/entry/SQL-%ED%8A%B9%EC%A0%95-%EA%B8%B0%EA%B0%84%EB%8F%99%EC%95%88-%EB%8C%80%EC%97%AC-%EA%B0%80%EB%8A%A5%ED%95%9C-%EC%9E%90%EB%8F%99%EC%B0%A8%EB%93%A4%EC%9D%98-%EB%8C%80%EC%97%AC%EB%B9%84%EC%9A%A9-%EA%B5%AC%ED%95%98%EA%B8%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4MySQLLevel-4

 

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

안녕하세요! 데코입니다! 오늘은 프로그래머스 코딩테스트 연습에 있는 "특정 기간동안 대여 가능한 자동차들의 대여비용 구하기" 문제를 포스팅하려고 합니다! 바로 포스팅 시작할게요! :) (출

kkw-da.tistory.com

https://velog.io/@gayeong39/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%8A%B9%EC%A0%95-%EA%B8%B0%EA%B0%84%EB%8F%99%EC%95%88-%EB%8C%80%EC%97%AC-%EA%B0%80%EB%8A%A5%ED%95%9C-%EC%9E%90%EB%8F%99%EC%B0%A8%EB%93%A4%EC%9D%98-%EB%8C%80%EC%97%AC%EB%B9%84%EC%9A%A9-%EA%B5%AC%ED%95%98%EA%B8%B0

 

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

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