개발자가 되고 싶은 개발자

SQL) 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 본문

Dev/Algorithm

SQL) 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

Fullth 2023. 5. 18. 00:56
 

프로그래머스

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

programmers.co.kr

*본문에서 테이블에 대한 정보는 생략하도록 하겠습니다.

*MySQL로 작성하였습니다.

조건

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

작성한 쿼리

SELECT rent.CAR_ID
     , rent.CAR_TYPE
     , ROUND(rent.DAILY_FEE * 30 * (100 - discount.DISCOUNT_RATE) / 100) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS rent
     JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS history
          ON history.CAR_ID = rent.CAR_ID
     JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS discount
          ON discount.CAR_TYPE = rent.CAR_TYPE
WHERE (rent.CAR_TYPE = 'SUV' OR rent.CAR_TYPE = '세단')
  AND rent.CAR_ID NOT IN (SELECT CAR_ID
                          FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                          WHERE END_DATE >= '2022-11-01')
  AND discount.DURATION_TYPE = '30일 이상'
GROUP BY rent.CAR_ID, rent.CAR_TYPE, FEE
HAVING FEE >= 500000 AND FEE < 2000000
ORDER BY FEE DESC
       , CAR_TYPE ASC
       , CAR_ID DESC

정답

해설

*순차적으로 설명을 작성하였습니다.

  1. 조회하고자 하는 CAR_ID, CAR_TYPE, FEE(할인율을 적용한 금액 대여 금액)을 명시하고, GROUP BY절에서 그룹화 합니다.
  2. 각 테이블마다 관계를 맞춰 JOIN을 걸어줍니다.
  3. 1번 조건에 따라 CAR_TYPE이 'SUB' 또는 '세단'인 값을 찾습니다.
  4. CAR_TYPE을 필터링 할 때 주의해야 할 사항은 괄호를 반드시 명시해야 한다는 점입니다.
    OR 연산자는 AND 연산자보다 우선순위가 낮기 때문에, 괄호를 넣어줌으로써 명시적으로 우선순위를 변경해주어야 합니다.
    만약 괄호를 넣어주지 않는다면, 연산자 우선순위에 따라 '세단' 과 뒤의 AND 조건이 먼저 비교되고 앞의 SUV의 OR 조건이 비교되기 때문에 전혀 다른 결과가 나오게 됩니다. (아래 잘못된 쿼리의 결과도 첨부하도록 하겠습니다.)
  5. 2번 조건에 따라 11월 동안 대여가 가능한 차량을 찾아야 하기 때문에 히스토리 테이블에서 10월 31일 이후까지 빌린 차량이 아닌 CAR_ID를 필터링합니다.
  6. 3번 조건에 따라 '30일 이상'의 할인 유형을 적용하고, 대여 금액 조건도 필터링 합니다.
  7. 5번 조건에 따라 정렬 순서를 나열해줍니다.

OR 조건에서 괄호를 제외한 실행 결과

*틀린 부분이나 보충 설명이 필요한 부분은 댓글 작성해주시면 감사하겠습니다!

'Dev > Algorithm' 카테고리의 다른 글

신박한 공배수 풀이 기록  (0) 2024.02.20
[Algorithm] 유형 목록  (0) 2022.06.11
[Algorithm] 프로그래머스 레벨2 124나라의 숫자  (0) 2022.01.06
[Algorithm] Euclidean Algorithm  (0) 2021.11.07
[Algorithm] Greedy Algorithm  (0) 2021.11.02