https://school.programmers.co.kr/learn/courses/30/lessons/157339
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
■ 자동차 종류 : 세단 or SUV
■ 2022.11.01 ~ 2022.11.30 대여 가능
■ 30일간 대여 금액이 50만원 이상 200만원 미만
코드
SELECT I.CAR_ID, I.CAR_TYPE,
ROUND((1 - 0.01 * D.DISCOUNT_RATE) * I.DAILY_FEE * 30) AS FEE
FROM CAR_RENTAL_COMPANY_CAR I
INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H
ON I.CAR_ID = H.CAR_ID
INNER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN D
ON I.CAR_TYPE = D.CAR_TYPE
WHERE I.CAR_ID NOT IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE END_DATE >= '2022-11-01' AND START_DATE <= '2022-11-30'
)
AND D.DURATION_TYPE = '30일 이상'
GROUP BY I.CAR_ID
HAVING FEE >= 500000 AND FEE < 2000000
ORDER BY 3 DESC, 2, 1 DESC;
풀이
해당 문제에서 주의해야 할 부분은 WHERE 절에서 날짜 필터링과 대여 기간 종류(DURATION_TYPE) 필터링이다.
우선 날짜 필터링부터 보자.
2022-11-01 ~ 2022-11-30 사이에 대여가 가능해야 하기 때문에
START_DATE는 반드시 2022-11-30 전에 대여한 목록이 있으면 안되고,
END_DATE는 반드시 2022-11-01 후에 대여한 목록이 있으면 안된다.
NOT IN 조건을 사용하는 이유는 하나라도 해당 조건을 만족하지 않으면 CAR_ID를 전부 제외해주어야 하기 때문이다.
다음은 대여 기간 종류 필터링을 보자.
같은 CAR_TYPE이더라도 DURATION_TYPE에 따라 DISCOUNT_RATE이 다르기 때문에 반드시 DURATION_TYPE = '30일 이상'이라는 조건이 필요하다.
'SQL > Coding Test' 카테고리의 다른 글
[프로그래머스] 그룹별 조건에 맞는 식당 목록 출력하기 (0) | 2024.03.28 |
---|---|
[프로그래머스] 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2024.03.21 |
[프로그래머스] 조건에 맞는 개발자 찾기 (0) | 2024.03.20 |
[프로그래머스] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.03.20 |
[프로그래머스] 가격대 별 상품 개수 구하기 (0) | 2024.03.19 |