[SQL 오답] 프로그래머스 자동차 대여 기록 별 대여 금액 구하기 (WITH AS, DATEDIFF)

byeol·2023년 4월 17일
0

접근

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

⏺️ 이 문제는 DATEDIFF 메서드를 몰라 틀렸습니다.

대여 시작일과 종료일을 데이터로 주어지는데
시작일과 종료일로 대여기간을 구해야합니다.

처음에 (END_DATE - START_DATE)+1로 하여 대여기간을 구했는데
만약에 2022-09-21 - 2022-08-17 을 하며 36일이 아닌 104를 반환했습니다.
따라서 날짜 사이의 차이를 계산하는 함수가 필요했고
DATEDIFF에 대해서 알게되었습니다.

⏺️ 이 문제의 경우 3개의 테이블이 등장합니다.
여러 개의 테이블이 등장하는 문제의 경우에는
두 개의 테이블이 만나 어떤 정보를 제공해서
나머지 테이블과 어떤 관계를 맺어야 하는지 차근차근 접근하면
쉽게 풀립니다.

즉 n개의 테이블이 주어진 경우에는
처음 2개의 테이블이 만나 문제를 만족할 수 있는 하나의 테이블로 JOIN하는 방법에 대해서
접근하도록 합니다.

⏺️ 또한 여러 테이블이 등장하면 SQL문이 길어집니다.
앞서 이야기 했듯이 두개의 테이블끼리 JOIN하는 문장이 계속 등장하기 때문에
풀다보면 어디가 어디까지인지 잊어버릴 수도 있습니다.
그래서 가상의 테이블을 만들어서 활용하는 방법도 있습니다.

바로 WITH 가상의 테이블 AS (

 두 개의 테이블 SELELCT 문

) 를 통해서 구현해내는 것입니다.

풀이

WITH T AS(
SELECT CAR_TYPE,HISTORY_ID,(DATEDIFF(END_DATE,START_DATE)+1)* DAILY_FEE AS PERIOD	,
CASE
WHEN DATEDIFF(END_DATE,START_DATE)+1 < 7 THEN NULL
WHEN DATEDIFF(END_DATE,START_DATE)+1< 30 THEN '7일 이상' 
WHEN DATEDIFF(END_DATE,START_DATE)+1 < 90 THEN  '30일 이상' 
ELSE '90일 이상' 
END AS DURATION_TYPE
FROM CAR_RENTAL_COMPANY_CAR AS A 
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS B
USING (CAR_ID)
WHERE CAR_TYPE = '트럭'
)

SELECT HISTORY_ID, (100-IFNULL(C.DISCOUNT_RATE,0))*PERIOD DIV 100 AS FEE
FROM T 
LEFT OUTER JOIN 
(SELECT *
 FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN 
 WHERE CAR_TYPE = '트럭'
)AS C  
ON(T.DURATION_TYPE = C.DURATION_TYPE)
ORDER BY FEE DESC, HISTORY_ID DESC;
profile
꾸준하게 Ready, Set, Go!

0개의 댓글