programmers/sql
프로그래머스 자동차 대여금액 문제들 (Mysql)
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(숫자,소숫점자릿수) 함수로 버림 해준다.