728x90
SMALL
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

# 일단, 쿼리 구조를 세워보면,
# HISTORY_ID와 가격을 구해야하는데,
# 가격은 DAILY_FEE * DISCOUNT_RATE * (DATEDIFF(END_DATE, START_DATE) + 1)
# SELECT START_DATE, END_DATE, DATEDIFF(END_DATE, START_DATE) + 1 AS DIFF
# FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
# FEE는 DAILY_FEE * DIFF * 할인율
# 할인율 같은 경우에는 DIFF에 따라 CASE로 나눠줘야하는데, BETWEEN으로 분기 처리해주자.
# 그리고 COALESCE를 사용해서 NULL일 때는 그냥 기본 요금대로 지불하도록 하자
SELECT H.HISTORY_ID,
FLOOR(C.DAILY_FEE * (DATEDIFF(H.END_DATE, H.START_DATE) + 1) * (
1 - COALESCE(P.DISCOUNT_RATE, 0) / 100
)) AS FEE
FROM CAR_RENTAL_COMPANY_CAR C
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID
# 7일 미만인 친구들도 챙겨주려면 LEFT JOIN해주는 게 맞다 !
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P ON C.CAR_TYPE = P.CAR_TYPE
AND P.DURATION_TYPE = (
CASE
WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 90 THEN '90일 이상'
WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 30 THEN '30일 이상'
WHEN DATEDIFF(H.END_DATE, H.START_DATE) + 1 >= 7 THEN '7일 이상'
ELSE NULL
END
)
WHERE C.CAR_TYPE = '트럭'
ORDER BY FEE DESC, H.HISTORY_ID DESC;
왜 이렇게 풀었을까?
- 우선 처음에 문제를 잘못 보고 할인율이 고정되어 있는 줄 알았는데 ! 그래서 할인율 테이블은 조인 안하려고 했는데 ! 고정이 아니어서 LEFT JOIN을 해주었습니다.
- 초기에는 CTE로 풀려다가 그보다는 LEFT JOIN으로 7일 미만 사용자에 대해서 더 간편하게 처리할 수 있었습니다. (NULL 처리 덕분)
- 그리고 COALESCE 함수를 활용해서 7일 미만 대여한 사용자에 대해서도 기본값으로 대여할 수 있도록 해주었습니다.
- COALESCE 함수는 DISCOUNT_RATE가 NULL일 경우 0을 반환해주는 친구입니다.
- 날짜 계산할 때에는 DATEDIFF(END_DATE, START_DATE)로 해주었고, 이에 따라 CASE 구문으로 조건에 맞게 할인 타입을 결정할 수 있었습니다.
728x90
LIST
'알고리즘 문제 풀이 > SQL 고득점 Kit' 카테고리의 다른 글
| 📕 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2025.10.01 |
|---|---|
| 📕 대장균의 크기에 따라 분류하기 2 (0) | 2025.09.26 |
| 📕 입양 시각 구하기(2) (0) | 2025.09.20 |
| 📙 부서별 평균 연봉 조회하기 (2) | 2025.01.30 |
| 📙 즐겨찾기가 가장 많은 식당 정보 출력하기 (2) | 2025.01.27 |