본문 바로가기
MYSQL/프로그래머스 LV04

자동차 대여 기록 별 대여 금액 구하기

by 수스리 2025. 3. 20.

https://school.programmers.co.kr/learn/courses/30/lessons/151141

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

코드

SELECT
    HISTORY_ID,
    ROUND (CASE 
    WHEN TIMESTAMPDIFF(DAY, START_DATE, END_DATE) + 1>= 90 THEN (daily_fee * (TIMESTAMPDIFF(DAY, START_DATE, END_DATE) + 1)) * (1 - (discount_rate / 100))
    WHEN TIMESTAMPDIFF(DAY, START_DATE, END_DATE) + 1>= 30 THEN (daily_fee * (TIMESTAMPDIFF(DAY, START_DATE, END_DATE) + 1)) * (1 - (discount_rate / 100))
    WHEN TIMESTAMPDIFF(DAY, START_DATE, END_DATE) + 1>= 7 THEN (daily_fee * (TIMESTAMPDIFF(DAY, START_DATE, END_DATE) + 1)) * (1 - (discount_rate / 100))
    ELSE (daily_fee * (TIMESTAMPDIFF(DAY, START_DATE, END_DATE) + 1))
    END) AS FEE
FROM
    CAR_RENTAL_COMPANY_CAR C
JOIN
    CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON H.CAR_ID = C.CAR_ID
LEFT JOIN
    CAR_RENTAL_COMPANY_DISCOUNT_PLAN P ON C.CAR_TYPE = P.CAR_TYPE AND
    CASE 
    WHEN TIMESTAMPDIFF(DAY, START_DATE, END_DATE) + 1>= 90 THEN "90일 이상"
    WHEN TIMESTAMPDIFF(DAY, START_DATE, END_DATE) + 1>= 30 THEN "30일 이상"
    WHEN TIMESTAMPDIFF(DAY, START_DATE, END_DATE) + 1>= 7 THEN "7일 이상"
    ELSE "해당없음"
    END = P.DURATION_TYPE
WHERE
    C.CAR_TYPE = "트럭" 
ORDER BY
    FEE DESC,
    HISTORY_ID DESC

이문제 상당히 오래걸렸다.

JOIN으로 CASE WHEN절을 사용하는 법을 몰랐기 때문이다. 예를 들면
CASE 
When 조건 then 열 이름
End = 조인 할 컬럼을 쓴다