프로그래머스 - 자동차 대여기록 별 대여 금액 구하기

fpg1·2023년 8월 14일

SQL

목록 보기
1/1

프로그래머스 문제
https://school.programmers.co.kr/learn/courses/30/lessons/157339

강의
https://youtu.be/G6t8YTEeLXw

문제이해
  • 대여 금액을 구하는 문제
    • 대여 금액을 구해서 대여 기록 ID 와 대여 금액 리스트를 출력하는 SQL 문을 구하는 문제
기본키 찾기
  • 각 테이블의 기본키를 구해보자
    • DESC CAR_RENTAL_COMPANY_CAR
      DESC 테이블 명을 검색해보아 어떻게 출력되는지 확인해보자
      출력결과 car_id 가 기본키 PRI 이란걸 알 수 있다
      DESC CAR_RENTAL_COMPANY_RENTAL_HISTORY -> history_id: PRI
      DESC CAR_RENTAL_COMPANY_DISCOUNT_PLAN -> plan_id: PRI
외래키 찾기
  • 기본키의 칼럼명과 같은 칼럼이 다른 테이블에도 있는지 확인하기
    • 외래키가 없으면 join 할 수 없다
    • 본 문제에서 유일한 FK 관계는
    # CAR_RENTAL_COMPANY_RENTAL_hISTORY
    # PK : history_id
    # FK : CAR_ID
대여기간 계산하기
  • join 시켜보기 - 문제에서 자동차종류 트럭만 요구하고있다
    SELECT *
    FROM CAR_RENTAL_COMPANY_CAR CAR JOIN CAR_RENTAL_COMPANY_RENTAL_hiSTORY HIS
    ON CAR CAR_ID = HIS.CAR_ID
    WHERE CAR_TYPE = '트럭'
    • 다시 (문제풀기에, 중복없는) 필요한 칼럼만 출력
    SELECT CAR.CAR_ID, DAILY_FEE, HISTORY_ID, START_DATE, END_DATE
    FROM CAR_RENTAL_COMPANY_CAR CAR JOIN CAR_RENTAL_COMPANY_RENTAL_hiSTORY HIS
    ON CAR CAR_ID = HIS.CAR_ID
    WHERE CAR_TYPE = '트럭'
  • 서브쿼리로 넘기고 필요한 칼럼(대여기간) 계산
    SELECT *, DATEDIFF(END_DATE, START_DATE) + 1 AS 'RENTAL_PERIOD'
    FROM (
    SELECT CAR.CAR_ID, DAILY_FEE, HISTORY_ID, START_DATE, END_DATE
    FROM CAR_RENTAL_COMPANY_CAR CAR JOIN CAR_RENTAL_COMPANY_RENTAL_hiSTORY HIS
    ON CAR CAR_ID = HIS.CAR_ID
    WHERE CAR_TYPE = '트럭') TBL1
대여기간별 분류작업
SELECT
HISTORY_ID
RENTAL_ PERIOD * ROUND(DAILY_FEE - (DAILY_FEE * DISCOUNT_RATE), 0) FEE
FROM (
SELECT *,
	CASE WHEN RENTAL_PERIOD >= 90 THEN (SELECT DISCOUNT_RATE / 100 FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN WHERE CAR_TYPE = '트럭' AND DURATION_TYPE = '90일 이상')
  WHEN RENTAL_PERIOD >= 30 THEN (SELECT DISCOUNT_RATE / 100 FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN WHERE CAR_TYPE = '트럭' AND DURATION_TYPE = '30일 이상')
  WHEN RENTAL_PERIOD >= 7 THEN (SELECT DISCOUNT_RATE / 100 FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN WHERE CAR_TYPE = '트럭' AND DURATION_TYPE = '7일 이상')
  ELSE 0.00 END AS 'DISCOUNT RATE'

FROM (

SELECT *, DATEDIFF(END_DATE, START_DATE) + 1 AS 'RENTAL_PERIOD'
FROM (
SELECT CAR.CAR_ID, DAILY_FEE, HISTORY_ID, START_DATE, END_DATE
FROM CAR_RENTAL_COMPANY_CAR CAR JOIN CAR_RENTAL_COMPANY_RENTAL_hiSTORY HIS
ON CAR CAR_ID = HIS.CAR_ID
WHERE CAR_TYPE = '트럭') TBL_1 ) TBL_2) TBL_3
ORDER BY FEE DESC, HISTORY_ID DESC;
profile
backend

0개의 댓글