Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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. 20. 17:24

- 문제

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.

 

코딩테스트 연습 - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 | 프로그래머스 스쿨

 

프로그래머스

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

programmers.co.kr

 

 

 

- 키포인트

'7일 이상', '30일 이상'의 내용이 담긴 컬럼을 어떻게 처리해야 할까?

2022-11-01 부터 2022-11-30 까지 사용가능한 차량 필터링 - 잘못함

 

<결론> 

1. 딱 30일 빌리는 거니깐 처리할 필요가 없었음

2. 날짜 필터링을 엉터리로 함

WHERE C.CAR_ID IN ( 
        SELECT CAR_ID
        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
        WHERE END_DATE < '2022-11-01' OR START_DATE > '2022-11-30'  
) AND P.DURATION_TYPE like '30%'
GROUP BY C.CAR_ID 
HAVING C.CAR_TYPE IN ('세단', 'SUV') 
    AND (FEE >= 500000 AND FEE < 2000000)

 

 

이렇게 접근하니까 

START_DATE<=11-30 이고 END_DATE>=11-01 인 대우 컬럼 못찾음

> 이렇게 하면 절대 안됨!

 

- 코드

SELECT C.CAR_ID, C.CAR_TYPE, 
ROUND(30*C.DAILY_FEE*0.01*(100-P.DISCOUNT_RATE),0) AS FEE
FROM CAR_RENTAL_COMPANY_CAR C JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID=H.CAR_ID JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P ON C.CAR_TYPE=P.CAR_TYPE
WHERE P.DURATION_TYPE LIKE '30%' AND C.CAR_TYPE IN ('SUV','세단')
AND C.CAR_ID NOT IN 
(SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE START_DATE<='2022-11-30' AND END_DATE>='2022-11-01')
GROUP BY C.CAR_ID
HAVING FEE BETWEEN 500000 AND 2000000 
ORDER BY FEE DESC, C.CAR_TYPE ASC, C.CAR_ID DESC;

 

SELECT C.CAR_ID, C.CAR_TYPE, 
       ROUND(C.DAILY_FEE * (100 - P.DISCOUNT_RATE)/100*30,0) AS FEE
FROM CAR_RENTAL_COMPANY_CAR C
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P ON C.CAR_TYPE = P.CAR_TYPE
WHERE C.CAR_TYPE IN ('세단','SUV') 
    AND P.DURATION_TYPE ='30일 이상'
GROUP BY C.CAR_ID
HAVING (MAX(END_DATE) < '2022-11-01') AND FEE BETWEEN 500000 AND 2000000
ORDER BY FEE DESC, C.CAR_TYPE ASC, C.CAR_ID DESC;

 

CAR_ID로 그룹바이 후 MAX(END_DATE) < 2022-11-01를 필터링하면 더 쉽게 코드 작성 가능