[TIL] 23.04.04

문종현·2023년 4월 4일
0

TIL

목록 보기
101/119
post-custom-banner

👉 오늘 한 일

  • 프로그래머스 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) 좀 더 정확한 정답일 듯 하다! 이 문제에서는 크게 지장이 없었지만..
profile
자라나라 새싹새싹🌱
post-custom-banner

0개의 댓글