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) 컬럼에서 금액 조건 필터링
'SQL 문제풀이' 카테고리의 다른 글
[프로그래머스 SQL] LV.5 상품을 구매한 회원 비율 구하기 (0) | 2023.08.12 |
---|---|
[프로그래머스 SQL] LV.4 자동차 대여 기록 별 대여 금액 구하기 (0) | 2023.08.12 |
[프로그래머스 SQL] LV.1 조건에 부합하는 중고거래 댓글 조회하기 (0) | 2023.08.12 |
[프로그래머스 SQL] LV.4 입양 시각 구하기(2) (0) | 2023.08.11 |
[프로그래머스 SQL] LV.4 오프라인/온라인 판매 데이터 통합하기 (0) | 2023.08.11 |