상세 컨텐츠

본문 제목

프로그래머스 자동차 대여금액 문제들 (Mysql)

programmers/sql

by nownow 2024. 2. 14. 17:46

본문

특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

SELECT
CAR.CAR_ID,
CAR.CAR_TYPE,
TRUNCATE(DAILY_FEE * 30 * ((100- DISCOUNT_RATE)/100),0) AS FEE
FROM
CAR_RENTAL_COMPANY_CAR AS CAR
JOIN
CAR_RENTAL_COMPANY_RENTAL_HISTORY AS HISTORY
USING(CAR_ID)
JOIN
CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS PLAN
USING(CAR_TYPE)
WHERE CAR_ID
NOT IN(
    SELECT
    CAR_ID
    FROM
    CAR_RENTAL_COMPANY_CAR AS CARS
    JOIN
    CAR_RENTAL_COMPANY_RENTAL_HISTORY AS HISTORIES
    USING(CAR_ID)
    WHERE
    CAR_TYPE IN("세단","SUV")
    AND
    START_DATE<="2022-11-30" AND END_DATE>="2022-11-01"
    )
AND
CAR_TYPE IN("세단","SUV")
AND
DURATION_TYPE="30일 이상"
GROUP BY CAR_ID
HAVING
FEE >=500000
AND
FEE <=2000000
ORDER BY 3 DESC,
2,
1 DESC

해당날짜중 대여중인 기종의 CAR_ID를 기반으로 필터링 하고 30일 기준 요금 계산 후

요금으로 한번 더 필터링 해서 마무리.

 

 

 

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

WITH TEMPTABLE AS(
    SELECT
    *,
    CASE 
    WHEN TIMESTAMPDIFF(DAY,START_DATE,END_DATE)+1 <7 THEN NULL
    WHEN TIMESTAMPDIFF(DAY,START_DATE,END_DATE)+1 <30 THEN "7일 이상"
    WHEN TIMESTAMPDIFF(DAY,START_DATE,END_DATE)+1 <90 THEN "30일 이상"
    ELSE "90일 이상"
    END AS DURATION,
    TIMESTAMPDIFF(DAY,START_DATE,END_DATE)+1 AS DAYS
    FROM
    CAR_RENTAL_COMPANY_CAR AS CARS
    JOIN
    CAR_RENTAL_COMPANY_RENTAL_HISTORY AS HISTORIES
    USING (CAR_ID)
    WHERE CAR_TYPE = "트럭"
)
SELECT
HISTORY_ID,
TRUNCATE(IF(DURATION IS NULL, DAYS*DAILY_FEE, 
   DAYS*DAILY_FEE *((100-DISCOUNT_RATE)/100)) ,0)AS FEE
FROM
CAR_RENTAL_COMPANY_DISCOUNT_PLAN  AS PLAN
JOIN
TEMPTABLE
USING(CAR_TYPE)
WHERE 
DURATION IS NULL
OR
DURATION_TYPE=DURATION
GROUP BY HISTORY_ID
ORDER BY 2 DESC,
1 DESC

WITH AS 문으로 트럭인 자동차들만 추려 기간에 맞추어 DURATION_TYPE 형식으로 기간 COLUMN을 추가해둔다.

TIMESTAMPDIFF(DAY , A, B)를 활용하면 하루 지날때마다 1을 세므로

10월 10일에 빌려 10월 10일에 반납한 케이스에서 0일로 체크가 되어버린다. +1 해주어야 함.

새로 만든 테이블과 할인율 테이블을 JOIN 한다.

대여기간이 동일하거나 할인이 적용되지 않는 차량만 선택해서

그에 맞추어 할인율을 적용하고

TRUNCATE(숫자,소숫점자릿수)  함수로 버림 해준다.

관련글 더보기