👉 오늘 한 일
- 프로그래머스 SQL 문제풀이
- 책 집필 - 편집 툴 적용
프로그래머스 SQL
1. 자동차 대여 기록 별 대여 금액 구하기 💡
- 프로그래머스 lv 4, 자동차 대여 기록 별 대여 금액 구하기
- lv 4, String & Date
- 가장 먼저 대여 기록 테이블에서 대여일과 대여일에 따른 대여기간 종류를 담은 필드 생성. 7일 미만이면 NULL로 처리. 다음으로 car_id에 따라 차 정보 테이블을 조인함. 여기까지 진행한 테이블에서 모든 기록 정보를 남겨두고 차 종류(car_type)별로 대여기간 종류와 할인률을 매칭시킬 수 있도록 LEFT JOIN으로 할인 정책 테이블을 조인함. 이후 차 종류가 트럭인 것만 필터링.
- 이후에 테이블을 보면 7일 미만인 것들은 할인률이 NULL인 것을 확인할 수 있음. 이들은 할인이 없으므로 IFNULL 을 사용해 1로 처리하고 일일요금과 대여일을 곱해 최종 대여 금액을 구함.
SELECT history_id,
ROUND((c.daily_fee * IFNULL((100 - p.discount_rate) / 100, 1) * h.diff)) fee
FROM (
SELECT history_id,
car_id,
DATEDIFF(end_date, start_date) + 1 diff,
CASE
WHEN DATEDIFF(end_date, start_date) >= 90 THEN "90일 이상"
WHEN DATEDIFF(end_date, start_date) >= 30 THEN "30일 이상"
WHEN DATEDIFF(end_date, start_date) >= 7 THEN "7일 이상"
ELSE NULL END duration_type
FROM car_rental_company_rental_history) h
JOIN car_rental_company_car c
ON h.car_id = c.car_id
LEFT JOIN car_rental_company_discount_plan p
ON c.car_type = p.car_type
AND h.duration_type = p.duration_type
WHERE c.car_type = "트럭"
ORDER BY fee DESC, history_id DESC
- 다 풀고나서 다시 내가 푼 쿼리를 봤는데 CASE 문에 있는 DATEDIFF에도 1씩 더해주는게(
DATEDIFF(end_date, start_date)+1
) 좀 더 정확한 정답일 듯 하다! 이 문제에서는 크게 지장이 없었지만..