-
[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기 - MySQLDataBase/MySQL 2023. 2. 23. 11:34
문제
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/151141
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 알고리즘 분류 - String, Date
- 난이도 - Level 4
관련 개념
형변환 함수 - CAST()
CAST(변경 대상 AS 변경 타입)
*정수와 문자가 혼용된 문자열을 정수형으로 형변환 할 경우, 숫자 형태의 문자만 남기고 그 문자만 변환해주는 듯 하다.
ex) cast('7일 이상' as unsigned) => 7
접근 방법
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블의 대여 기간에 따라 CAR_RENTAL_COMPANY_PLAN 테이블의 할인율을 적용하는 게 어려웠다.
다른 언어였다면 arr[0] <= x <= arr[1]와 같이 쓸 수 있었을 텐데, 인덱스 없이 값이 다른 테이블의 특정 범위에 속하는지에 대한 sql 쿼리는 어떻게 작성할지 모르겠어서, 일단 모든 할인율을 적용하고 그 중 대여료가 가장 적은 것을 택하도록 작성했다.
답안 코드
SELECT B.HISTORY_ID, MIN(ROUND(A.DAILY_FEE * (DATEDIFF(B.END_DATE, B.START_DATE) + 1) * CASE WHEN DATEDIFF(B.END_DATE, B.START_DATE) + 1 >= CAST(C.DURATION_TYPE as unsigned) THEN (100-C.DISCOUNT_RATE) / 100 ELSE 1 END,0)) AS FEE FROM CAR_RENTAL_COMPANY_CAR A, CAR_RENTAL_COMPANY_RENTAL_HISTORY B, CAR_RENTAL_COMPANY_DISCOUNT_PLAN C WHERE A.CAR_TYPE = '트럭' AND C.CAR_TYPE = '트럭' AND A.CAR_ID = B.CAR_ID GROUP BY HISTORY_ID ORDER BY FEE DESC, B.HISTORY_ID DESC
'DataBase > MySQL' 카테고리의 다른 글
[프로그래머스] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 - MySQL (0) 2023.02.19 [프로그래머스] 자동차 대여 기록에서 장기/단기 대여 구분하기 - MySQL (2) 2023.02.19 [프로그래머스] 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (0) 2023.02.18 [MySQL] 특정 문자열 포함 여부, 횟수 찾기 - LIKE(), INSTR() (0) 2023.02.18 [프로그래머스] 평균 일일 대여 요금 구하기 - MySQL (0) 2023.02.18