프로그래머스 SQL 고득점 Kit에 몇문제 올라왔길래 바로 풀이 진행!
SELECT DISTINCT(CAR.CAR_ID)
FROM CAR_RENTAL_COMPANY_CAR AS CAR
INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS HISTORY ON CAR.CAR_ID = HISTORY.CAR_ID
WHERE CAR_TYPE = '세단' AND MONTH(START_DATE) = 10
ORDER BY CAR_ID DESC
< 풀이 과정 >
자동차 리스트는 중복이 없어야 하므로 ID를 DISTINCT한다.
이후, 두 테이블을 CAR_ID를 기준으로 INNER JOIN을 진행하고, CAR_TYPE이 세단, 대여 시작일이 10월인 조건을 걸어주고 CAR_ID기준 내림차순 정렬하여 출력
SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE,START_DATE)+1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(DATEDIFF(END_DATE, START_DATE)+1) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC
< 풀이 과정 >
날짜 차이의 평균을 구하기 위해, AVG 함수와 DATEDIFF함수를 통해 대여일의 평균을 AVERAGE_DURATION 필드로 나타냈고, CAR_ID 기준으로 GROUP BY 진행해 대여일이 7일 이상인 경우만 HAVING하여 출력하였다
SELECT *
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%네비게이션%'
ORDER BY CAR_ID DESC
< 풀이 과정 >
주어진 테이블의 모든 컬럼을 출력하고, 단지 OPTIONS 내에 네비게이션만 있으면 되므로 LIKE로 네비게이션이라는 단어가 포함되면 출력되도록 하였다.
SELECT CAR.CAR_ID, CAR.CAR_TYPE, ROUND(DAILY_FEE*30*(1-DISCOUNT_RATE/100)) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS CAR
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS HISTORY ON CAR.CAR_ID = HISTORY.CAR_ID
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS PLAN ON PLAN.CAR_TYPE = CAR.CAR_TYPE
WHERE CAR.CAR_ID NOT IN
(SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE < '2022-12-01' AND END_DATE >= '2022-11-01'
)
AND PLAN.DURATION_TYPE = '30일 이상'
GROUP BY CAR.CAR_ID
HAVING CAR.CAR_TYPE IN ('세단', 'SUV') AND FEE BETWEEN 500000 AND 2000000
ORDER BY FEE DESC, CAR_TYPE, CAR_ID DESC
< 풀이 과정 >
3개의 테이블을 살펴보면, CAR 테이블과 HISTORY 테이블은 CAR_ID만 겹치고, CAR 테이블과 PLAN 테이블은 CAR_TYPE만 겹치는 것을 발견하고 3테이블을 모두 JOIN하는 식으로 결정했다.
그 이후 CAR_ID를 고르는데, 기준이 11/1 ~ 11/30 기간 내 대여가 가능해야 하므로, START_DATE < 12/1 & END_DATE > 11/1 인 CAR_ID만 제외하고 뽑아 준다.
이어서 차량 대여는 30일로 고정하고 CAR_TYPE이 세단, SUV에 한해서 요금 기준을 BETWEEN으로 설정해 정렬한다.
요금 계산 방법은 일일요금(DAILY_FEE)30(1-할인율/100)으로 ROUND하여 정수형만 뽑아준다.