본문 바로가기
SQLD

[프로그래머스 SQL고득점 키트 String, Date]자동차 대여 기록 별 대여 금액 구하기

by 새싹감자 2023. 2. 9.

문제가 조금 까다로워서 푸는데 시간이 꽤 걸린 문제였다.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제


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

 

풀이


우선 History 테이블과 Company 테이블을 Join해서 함께 가져왔다.

이 테이블을 나중에 Plan테이블과 조인하려했는데, Duration_type을 어떻게 처리해야할지가 고민이었다.

그래서 애초에 테이블을 만들 때 DT행을 조건에 따라 만들고, 이를 활용하여 join조건 처리를 하였다.

SELECT H.history_id AS HI, C.car_type AS CT, DATEDIFF(H.end_date,H.start_date)+1 AS D, C.daily_fee AS DF,
 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일 이상"
 END AS DT
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H
LEFT JOIN CAR_RENTAL_COMPANY_CAR  C
ON H.CAR_ID=C.CAR_ID
WHERE CAR_TYPE='트럭'

이와같이 History테이블과 Company테이블을 CAR_ID를 통해서 join하고 그중에서 CAR_TYPE이 트럭인 행만 가져왔다.

 

이렇게 만든 테이블을 Plan테이블과 join하는데 Duration_type이 7일 미만인 컬럼도 해결을 해줘야 하므로 RIGHT JOIN을 사용했다. 할인율 계산은 100-Discount_Rate를 해서 원값과 곱해주면된다.

 

마지막으로 정렬조건만 맞춰주면 풀린다!

 

최종코드


SELECT B.HI AS HISTORY_ID,
IF(A.DISCOUNT_RATE IS NULL,(B.D)*(B.DF),round((100-A.DISCOUNT_RATE)/100*(B.DF))*B.D) AS FEE
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN A
RIGHT JOIN 
(SELECT H.history_id AS HI, C.car_type AS CT, DATEDIFF(H.end_date,H.start_date)+1 AS D, C.daily_fee AS DF,
 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일 이상"
 END AS DT
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H
LEFT JOIN CAR_RENTAL_COMPANY_CAR  C
ON H.CAR_ID=C.CAR_ID
WHERE CAR_TYPE='트럭') B
ON B.CT=A.CAR_TYPE AND A.DURATION_TYPE=B.DT
ORDER BY FEE DESC, HISTORY_ID DESC;

댓글