SQL 문제풀이

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

냄비짱 2023. 8. 12. 03:17
728x90

❓ Question

 

 

 

❗ Answer

# output : c.car_id, c.car_type, fee((DATEDIFF(h.end_date,h.start_date)+1)*c.daily_fee*d.discount_rate(대여일에 따라 d.duration_type에 맞는 d.discount_rate 입력)
# 조건 : c.car_type IN ('세단','SUV'), h.end_date < '2022-11-01' OR h.start_date < '2022-11-30', fee BETWEEN(50,200)
# alias : car_rental_company_car c, car_rental_company_rental_history h, car_rental_company_discount_plan d
# JOIN KEY : c.car_id = h.car_id / c.car_type = d.car_type

SELECT f.car_id, f.car_type, ROUND(30*f.daily_fee*(100-discount_rate)/100) fee
    FROM  (SELECT car_id, car_type, daily_fee
            FROM car_rental_company_car
            WHERE car_id IN (SELECT car_id
                                FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                                GROUP BY car_id
                                HAVING COUNT(car_id) = SUM((CASE WHEN end_date < '2022-11-01' OR start_date > '2022-11-30' THEN 1
                                                                 ELSE 0
                                                            END))
                             )
           ) f
    INNER JOIN car_rental_company_discount_plan d
            ON f.car_type = d.car_type
    WHERE d.duration_type = '30일 이상' AND f.car_type IN ('세단','SUV')
    HAVING fee BETWEEN 500000 AND 2000000
    ORDER BY fee DESC, car_type, car_id DESC;

📌 Discussion

  • 첫번째 sub query
    - car_id별로 GROUP BY 이후 HAVING 절에서 11월 한달 내내 대여 가능한 차량의 조건을 걸어준다.
    - 시작일이 11월 30일 이후거나 반납일이 11월 1일 이전이라면 대여가능한 차량
    - 대여가능은 1, 불가능은 0으로 두어 해당 컬럼의 합이 car_id의 count와 같으면 모든 기간에 대여가능
  • 두번째 sub query
    - car_rental_company_car에서 위에 해당하는 조건의 레코드를 추출
  • main query
    - 차종에 대해 join 후 30일*일일 대여 요금*(100-할인율)/100으로 30일간 대여 요금(fee)을 추출
    - WHERE 절에서 대여 요금의 종류와 차종을 필터링
    - 집계가 완료된 대여 요금(fee) 컬럼에서 금액 조건 필터링