Notice
Recent Posts
Recent Comments
Link
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

하루에 하나씩 공부하기

자동차 대여 기록 별 대여 금액 구하기-LV4 (재도전) 본문

SQL 코딩테스트/LV4

자동차 대여 기록 별 대여 금액 구하기-LV4 (재도전)

dltaexox 2025. 1. 21. 16:37

- 문제

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

 

 

코딩테스트 연습 - 자동차 대여 기록 별 대여 금액 구하기 | 프로그래머스 스쿨

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

- 키포인트

대여 기간과 DURATION_TYPE을 어떻게 비교할 것인가?

DURATION TYPE이 7일 미만인 경우는 어떻게 케이스 분류?

GROUP BY를 어떻게 설정할 것인가? - 조인 조건으로 GROUP BY 대체

테이블 조인할 때에는 INNER JOIN만 있는게 아니다!!! - LEFT, RIGHT 같은 OUTER JOIN도 항상 생각하기

 

- 코드

WITH TRUCK AS (
SELECT C.CAR_ID, C.CAR_TYPE, H.HISTORY_ID, DATEDIFF(H.END_DATE, H.START_DATE)+1 AS DAY, C.DAILY_FEE*(DATEDIFF(H.END_DATE, H.START_DATE)+1) AS TOTAL_FEE, 
CASE 
    WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 90 THEN '90일 이상'
    WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN '30일 이상'
    WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 7 THEN '7일 이상'
    ELSE 'NONE' END AS DURATION_TYPE
FROM CAR_RENTAL_COMPANY_CAR C JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID=H.CAR_ID
WHERE C.CAR_TYPE='트럭')  

SELECT T.HISTORY_ID, 
ROUND(T.TOTAL_FEE*0.01*(100-IFNULL(P.DISCOUNT_RATE,0))) AS FEE
FROM TRUCK T LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P ON T.DURATION_TYPE=P.DURATION_TYPE
AND T.CAR_TYPE=P.CAR_TYPE
ORDER BY 2 DESC, 1 DESC;

 

TRUCK 이라는 CTE 설정 후 여기서, DAY, TOTAL_FEE 생성

**새로운 DURATION_TYPE 설정** -> 이걸로 메인쿼리에서 조인에 사용

 

 

메인쿼리에서 DURATION_TYPE, CAR_TYPE으로 LEFT 조인하면 위와 같은 테이블 생성

여기서 7일 미만인 DURATION_TYPE은 PLAN P 테이블의 값이 NULL이 됨 > IFNULL() 사용해 0으로 설정