https://school.programmers.co.kr/learn/courses/30/lessons/157339
어렵다...
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
이렇게 하면 정답이다...
당연히 틀릴줄 알았는데! 맞아서 기분은 좋았다 흐흐
그치만 엄청 비효율적인 풀이로 보여서 ... 다른 분들의 풀이를 찾아보았다.
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
'SQL > 문제풀이' 카테고리의 다른 글
[프로그래머스] 조건에 부합하는 중고거래 댓글 조회하기 (0) | 2024.02.11 |
---|---|
[프로그래머스] 강원도에 위치한 생산공장 목록 출력하기 (0) | 2024.02.10 |
[프로그래머스] 주문량이 많은 아이스크림들 조회하기 (0) | 2024.01.05 |
[프로그래머스] 저자 별 카테고리 별 매출액 집계하기 (0) | 2024.01.05 |
[프로그래머스] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2024.01.03 |