일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- class-transformer
- maven
- 프로젝트 여러 개
- ojdbc6
- JavaScript
- Java
- Spring
- Stream
- javascript error
- TypeScript
- 프로그래머스
- DART
- 코어자바스크립트
- oracle
- REST
- 봤어요처리
- 인텔리제이
- flutter mac 설치
- svn
- db
- SQL
- MySQL
- Mac
- datagrip 한글깨짐
- InteliJ
- eqauls-hashcode
- node.js
- @RequestBody
- Aspect
- tecoble
Archives
- Today
- Total
개발자가 되고 싶은 개발자
SQL) 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 본문
*본문에서 테이블에 대한 정보는 생략하도록 하겠습니다.
*MySQL로 작성하였습니다.
조건
- 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중
- 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고
- 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서
- 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요.
- 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.
작성한 쿼리
SELECT rent.CAR_ID
, rent.CAR_TYPE
, ROUND(rent.DAILY_FEE * 30 * (100 - discount.DISCOUNT_RATE) / 100) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS rent
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS history
ON history.CAR_ID = rent.CAR_ID
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS discount
ON discount.CAR_TYPE = rent.CAR_TYPE
WHERE (rent.CAR_TYPE = 'SUV' OR rent.CAR_TYPE = '세단')
AND rent.CAR_ID NOT IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE END_DATE >= '2022-11-01')
AND discount.DURATION_TYPE = '30일 이상'
GROUP BY rent.CAR_ID, rent.CAR_TYPE, FEE
HAVING FEE >= 500000 AND FEE < 2000000
ORDER BY FEE DESC
, CAR_TYPE ASC
, CAR_ID DESC
해설
*순차적으로 설명을 작성하였습니다.
- 조회하고자 하는 CAR_ID, CAR_TYPE, FEE(할인율을 적용한 금액 대여 금액)을 명시하고, GROUP BY절에서 그룹화 합니다.
- 각 테이블마다 관계를 맞춰 JOIN을 걸어줍니다.
- 1번 조건에 따라 CAR_TYPE이 'SUB' 또는 '세단'인 값을 찾습니다.
- CAR_TYPE을 필터링 할 때 주의해야 할 사항은 괄호를 반드시 명시해야 한다는 점입니다.
OR 연산자는 AND 연산자보다 우선순위가 낮기 때문에, 괄호를 넣어줌으로써 명시적으로 우선순위를 변경해주어야 합니다.
만약 괄호를 넣어주지 않는다면, 연산자 우선순위에 따라 '세단' 과 뒤의 AND 조건이 먼저 비교되고 앞의 SUV의 OR 조건이 비교되기 때문에 전혀 다른 결과가 나오게 됩니다. (아래 잘못된 쿼리의 결과도 첨부하도록 하겠습니다.) - 2번 조건에 따라 11월 동안 대여가 가능한 차량을 찾아야 하기 때문에 히스토리 테이블에서 10월 31일 이후까지 빌린 차량이 아닌 CAR_ID를 필터링합니다.
- 3번 조건에 따라 '30일 이상'의 할인 유형을 적용하고, 대여 금액 조건도 필터링 합니다.
- 5번 조건에 따라 정렬 순서를 나열해줍니다.
*틀린 부분이나 보충 설명이 필요한 부분은 댓글 작성해주시면 감사하겠습니다!
'Dev > Algorithm' 카테고리의 다른 글
신박한 공배수 풀이 기록 (0) | 2024.02.20 |
---|---|
[Algorithm] 유형 목록 (0) | 2022.06.11 |
[Algorithm] 프로그래머스 레벨2 124나라의 숫자 (0) | 2022.01.06 |
[Algorithm] Euclidean Algorithm (0) | 2021.11.07 |
[Algorithm] Greedy Algorithm (0) | 2021.11.02 |