문제가 조금 까다로워서 푸는데 시간이 꽤 걸린 문제였다.
https://school.programmers.co.kr/learn/courses/30/lessons/151141
문제
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;
'SQLD' 카테고리의 다른 글
[프로그래머스 SQL고득점 키트 String, Date]대여 기록이 존재하는 자동차 리스트 구하기 (0) | 2023.02.09 |
---|---|
[프로그래머스 SQL고득점 키트 String, Date]자동차 평균 대여 기간 구하기 (0) | 2023.02.09 |
[프로그래머스 SQL고득점 키트 String, Date]조건별로 분류하여 주문상태 출력하기 (0) | 2023.02.09 |
[프로그래머스 SQL고득점 키트 String, Date]자동차 대여 기록에서 장기/단기 대여 구분하기 (0) | 2023.02.09 |
[프로그래머스 SQL고득점 키트 String, Date]취소되지 않은 진료 예약 조회하기 (0) | 2023.02.09 |
댓글