알쿼리즘 스터디: 특정 기간의 자동차 대여비용 구하기

2024. 5. 16. 17:02전처리/SQL

 

01 문제 안내


 

프로그래머스

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

programmers.co.kr

 

02 정답 쿼리


1. CTE: 세단 또는 SUV의 30일 이상 가격 조건
WITH PRICE AS (SELECT CAR_ID, CAR.CAR_TYPE,
     FLOOR(DAILY_FEE*((100-DISCOUNT_RATE)*0.01)*30) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS CAR
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS PLA
ON CAR.CAR_TYPE = PLA.CAR_TYPE
WHERE DURATION_TYPE = '30일 이상'
AND (CAR.CAR_TYPE = '세단' OR CAR.CAR_TYPE ='SUV')
AND (FLOOR(DAILY_FEE*((100-DISCOUNT_RATE)*0.01)*30) BETWEEN 500000 AND 1999999)
)

2. MAIN: 22년 11월에 대여가 가능한 조건
SELECT CAR.CAR_ID,
       CAR.CAR_TYPE,
       FLOOR(PRI.FEE) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS CAR
JOIN PRICE AS PRI
ON CAR.CAR_ID=PRI.CAR_ID
WHERE CAR.CAR_ID NOT IN (SELECT DISTINCT CAR_ID
                         FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                         WHERE END_DATE >= '2022-11-01')

 

03 문제 해결


1. IN 이랑 OR의 결과가 다른 이유는?

- 문제는 괄호였다. AND 많을 때 AND, OR의 괄호를 항상 조심해야 한다.

- 괄호를 따로 주면 안되고 조건마다 AND () 먼저 작성하고 안에 입력하자.

 

2. 위 아래 WHERE 조건인 (CAR.CAR_TYPE = '세단' OR CAR.CAR_TYPE = 'SUV') 겹쳐서 하나 제거

 

3. 정수만 출력하는 것은 FLOOR()함수이다.

 

4. NOT IN (서브쿼리)가 유용했다. 반납일이 11-01보다 많다면 대여할 수 없음을 이용했다.

 

5. LEFT JOIN해도 자꾸 두 번씩 출력되는 이유는?

- 왼쪽 CAR_ID는 그대로 두는데 오른쪽 HISTORY부분이 같은 아이디당 렌탈 기록이 많음.

- 왼쪽이 변형되는 게 아니지만 대응되는 행이 여러개라 자아 분열될 수 밖에 없음.