하루에 하나씩 공부하기
자동차 대여 기록 별 대여 금액 구하기-LV4 (재도전) 본문
- 문제
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
코딩테스트 연습 - 자동차 대여 기록 별 대여 금액 구하기 | 프로그래머스 스쿨
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
- 키포인트
대여 기간과 DURATION_TYPE을 어떻게 비교할 것인가?
DURATION TYPE이 7일 미만인 경우는 어떻게 케이스 분류?
GROUP BY를 어떻게 설정할 것인가? - 조인 조건으로 GROUP BY 대체
테이블 조인할 때에는 INNER JOIN만 있는게 아니다!!! - LEFT, RIGHT 같은 OUTER JOIN도 항상 생각하기
- 코드
WITH TRUCK AS (
SELECT C.CAR_ID, C.CAR_TYPE, H.HISTORY_ID, DATEDIFF(H.END_DATE, H.START_DATE)+1 AS DAY, C.DAILY_FEE*(DATEDIFF(H.END_DATE, H.START_DATE)+1) AS TOTAL_FEE,
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 'NONE' END AS DURATION_TYPE
FROM CAR_RENTAL_COMPANY_CAR C JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID=H.CAR_ID
WHERE C.CAR_TYPE='트럭')
SELECT T.HISTORY_ID,
ROUND(T.TOTAL_FEE*0.01*(100-IFNULL(P.DISCOUNT_RATE,0))) AS FEE
FROM TRUCK T LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P ON T.DURATION_TYPE=P.DURATION_TYPE
AND T.CAR_TYPE=P.CAR_TYPE
ORDER BY 2 DESC, 1 DESC;
TRUCK 이라는 CTE 설정 후 여기서, DAY, TOTAL_FEE 생성
**새로운 DURATION_TYPE 설정** -> 이걸로 메인쿼리에서 조인에 사용
메인쿼리에서 DURATION_TYPE, CAR_TYPE으로 LEFT 조인하면 위와 같은 테이블 생성
여기서 7일 미만인 DURATION_TYPE은 PLAN P 테이블의 값이 NULL이 됨 > IFNULL() 사용해 0으로 설정
'SQL 코딩테스트 > LV4' 카테고리의 다른 글
주문량이 많은 아이스크림들 조회하기-LV4 (0) | 2025.01.22 |
---|---|
저자 별 카테고리 별 매출액 집계하기-LV4 (1) | 2025.01.22 |
특정 기간 동안 대여 가능한 자동차들의 대여비용 구하기-LV4 (재도전) (2) | 2025.01.20 |
Front End 개발자 찾기-LV4 (0) | 2025.01.17 |
언어별 개발자 분류하기-LV4 (0) | 2025.01.17 |