https://school.programmers.co.kr/learn/courses/30/lessons/151141
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
WITH TRUCK_INFO AS (
SELECT
T1.CAR_ID,
T2.HISTORY_ID,
T1.CAR_TYPE,
T1.DAILY_FEE,
DATEDIFF(END_DATE, START_DATE)+1 AS DURATION,
(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 NULL
END
) AS DURATION_TYPE
FROM CAR_RENTAL_COMPANY_CAR AS T1
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS T2
ON T1.CAR_ID = T2.CAR_ID
WHERE T1.CAR_TYPE = '트럭'
), PLAN AS (
SELECT DURATION_TYPE, (100 - DISCOUNT_RATE) / 100 AS RATE
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭'
)
SELECT HISTORY_ID, FLOOR(DAILY_FEE * DURATION * RATE) AS FEE
FROM
(
SELECT
CAR_ID,
HISTORY_ID,
DAILY_FEE,
DURATION,
IFNULL(RATE, 1) AS RATE
FROM TRUCK_INFO AS INFO
LEFT JOIN PLAN
ON PLAN.DURATION_TYPE = INFO.DURATION_TYPE
) AS RESULT
ORDER BY FEE DESC, HISTORY_ID DESC
저는 WITH
문으로 가상 테이블 TRUCK_INFO
, PLAN
을 만들고 두 테이블을 LEFT JOIN
하여 문제를 해결하였습니다.
TRUCK_INFO
먼저 TRUCK_INFO
테이블입니다. 테이블의 모습은 아래와 같습니다.
TRUCK_INFO
테이블은 CAR_RENTAL_COMPANY_CAR
테이블과 CAR_RENTAL_COMPANY_HISTORY
을 CAR_ID
를 기준으로 JOIN
하였고
WHERE
문에서 CAR_TYPE
중 '트럭'만 추출하였습니다.
그리고 SELECT 문에서 DATEDIFF
함수를 사용하여 대여기간(DURATION
)을 구하고CASE
문을 이용하여 아래와 같이 정의하였습니다.
- 대여기간 >= 90 : '90일 이상'
- 대여기간 >= 30 : '30일 이상'
- 대여기간 >= 7 : '7일 이상'
- 대여기간 < 7 : NULL
PLAN
PLAN
테이블은 CAR_RENTAL_COMPANY_DISCOUNT_PLAN
테이블에서 CAR_TYPE
이 ''트럭' 인 데이터만 추출하였습니다.SELECT
문에서는 DURATION_TYPE
과 할인율을 쉽게 계산하기 위한 RATE
컬럼을 만들었습니다.
RESULT
먼저 위에서 만든 TRUCK_INFO
, PLAN
테이블을 LEFT JOIN
하여 만든 서브쿼리를 테이블로 사용했습니다.
RATE
컬럼에서 NULL이 나온 값은1
로 대체
최종 결과에서는 DAILY_FEE
, DURATION
, RATE
를 모두 곱하고 FLOOR
를 사용하여 정수로 변환해주었습니다.
그리고 문제에서 요구한대로 FEE
를 기준으로 내림차순, HISTORY_ID
를 기준으로 내림차순 정렬하여 결과로 제출하였습니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 조건에 부합하는 중고거래 상태 조회하기 MySQL (0) | 2023.03.11 |
---|---|
[코딩테스트] 프로그래머스 조건에 부합하는 중고거래 댓글 조회하기 MySQL (0) | 2023.03.10 |
[코딩테스트] 프로그래머스 옹알이(2) 파이썬(Python) (0) | 2023.03.08 |
[코딩테스트] 프로그래머스 체육복 파이썬(Python) (0) | 2023.03.07 |
[코딩테스트] 프로그래머스 바탕화면 정리 파이썬(Python) (0) | 2023.03.06 |