문제
https://school.programmers.co.kr/learn/courses/30/lessons/157339
풀이
📍 조건
- 자동차 종류가 '세단' 또는 'SUV'인 자동차 중
- 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고
- 30일간의 대여 금액이 50만 원 이상 200만 원 미만인 자동차에 대해서
- 자동차 ID, 자동차 종류, 대여 금액(칼럼명: FEE) 리스트 출력
- 대여 금액 내림차순, 자동차 종류 오름차순 정렬, 자동차 ID를 기준으로 내림차순
📍 1차 조인
- car 테이블과 plan 테이블을 먼저 조인한다.
이때 30일간 대여가능한 자동차만 봐야하기 때문에 duration_type 조건도 JOIN ON에 걸어준다.
📍 WHERE 절
- (1) car_type 을 2종으로 제한하는 조건을 걸고,
- (2) 2022년 12월 1일부터 2022년 11월 30일까지 대여 가능한 리스트를 출력하기 위해 history 테이블을 서브쿼리로 사용한다.
→ 11월 한달 동안(30일) 대여 가능하려면 대여 날짜가 2022년 12월 01일보다 전이면서 반납 날짜가 2022년 11월 1일 이후인 경우를 피하면 된다 (또는 아래와 같이 조건을 걸 수 있음)
END_DATE > '2022-11-01' AND START_DATE < '2022-12-01'
📍 SELECT 절
- SELECT 절에 car_id, car_type, FEE를 계산해서 넣어준다.
- HAVING 절에 FEE의 조건을 지정한다 (30일간의 대여 금액이 50만 원 이상 200만 원 미만)
→ SELECT 절에서 생성한 컬럼이므로, WHERE가 아닌 HAVING에 넣어줘야 함!
HAVING FEE >= 500000 AND FEE < 2000000
- 문제에 제시된 대로 ORDER BY 절을 기입하고 마무리
SELECT CAR.CAR_ID,
CAR.CAR_TYPE,
ROUND(CAR.DAILY_FEE * 30 * (100 - PLAN.DISCOUNT_RATE)/100) AS FEE
-- 먼저 두 개 테이블 조인
FROM CAR_RENTAL_COMPANY_CAR AS CAR
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS PLAN
ON CAR.CAR_TYPE = PLAN.CAR_TYPE
AND PLAN.DURATION_TYPE = '30일 이상'
-- 차종류 조건 / 대여가능한 기간 조건(서브쿼리)
WHERE 1=1
AND CAR.CAR_TYPE IN ('세단', 'SUV')
AND 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'
)
-- 대여금액 조건
HAVING FEE >= 500000 AND FEE < 2000000
ORDER
BY FEE DESC
, CAR.CAR_TYPE ASC
, CAR.CAR_ID DESC;
728x90
'SQL > SQL test' 카테고리의 다른 글
[Programmers] 상품을 구매한 회원 비율 구하기 (0) | 2024.04.09 |
---|---|
[HackerRank] Interviews (Advanced Join) 풀이 (2) | 2024.01.17 |
[HackerRank] Occupations (Pivot) (0) | 2024.01.17 |
[HackerRank] SQL Project Planning (0) | 2024.01.17 |
[HackerRank] Contest Leaderboard (0) | 2024.01.16 |