반응형
테이블 정보
1. CAR_RENTAL_COMPANY_CAR
Column name | Type | Nullable |
CAR_ID | INTEGER | FALSE |
CAR_TYPE | VARCHAR(255) | FALSE |
DAILY_FEE | INTEGER | FALSE |
OPTIONS | VARCHAR(255) | FALSE |
2. CAR_RENTAL_COMPANY_RENTAL_HISTORY
Column name | Type | Nullable |
HISTORY_ID | INTEGER | FALSE |
CAR_ID | INTEGER | FALSE |
START_DATE | DATE | FALSE |
END_DATE | DATE | FALSE |
3. CAR_RENTAL_COMPANY_DISCOUNT_PLAN
Column name | Type | Nullable |
PLAN_ID | INTEGER | FALSE |
CAR_TYPE | VARCHAR(255) | FALSE |
DURATION_TYPE | VARCHAR(255) | FALSE |
DISCOUNT_RATE | INTEGER | FALSE |
예시 테이블
1. CAR_RENTAL_COMPANY_CAR
CAR_ID | CAR_TYPE | DAILY_FEE | OPTIONS |
1 | SUV | 25000 | 가죽시트,열선시트,후방카메라 |
2 | 세단 | 14000 | 스마트키,네비게이션,열선시트 |
3 | 트럭 | 32000 | 주차감지센서,후방카메라,가죽시트 |
4 | 세단 | 12000 | 열선시트,후방카메라 |
5 | 세단 | 22000 | 스마트키,주차감지센서 |
2. CAR_RENTAL_COMPANY_RENTAL_HISTORY
HISTORY_ID | CAR_ID | START_DATE | END_DATE |
1 | 1 | 2022-08-27 | 2022-09-02 |
2 | 1 | 2022-10-03 | 2022-10-04 |
3 | 2 | 2022-10-05 | 2022-10-20 |
4 | 2 | 2022-10-10 | 2022-11-12 |
5 | 3 | 2022-10-16 | 2022-10-17 |
3. CAR_RENTAL_COMPANY_DISCOUNT_PLAN
PLAN_ID | CAR_TYPE | DURATION_TYPE | DISCOUNT_RATE |
1 | 트럭 | 7일 이상 | 5% |
2 | 트럭 | 30일 이상 | 7% |
3 | 트럭 | 90일 이상 | 10% |
4 | 세단 | 7일 이상 | 5% |
5 | 세단 | 30일 이상 | 10% |
6 | 세단 | 90일 이상 | 15% |
7 | SUV | 7일 이상 | 3% |
8 | SUV | 30일 이상 | 8% |
9 | SUV | 90일 이상 | 12% |
문제
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.
아이디어
- 자동차 종류가 '세단' 또는 'SUV' 인 자동차 = IN으로 세단과 SUV만 봐야겠다.
- 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능 = TO_DATE나 TO_CHAR로 데이터 타입 파싱해야겠다.
- 30일간의 대여 금액이 50만원 이상 200만원 미만 = BETWEEN으로 범위 내 포함하지 않은 금액 거르자
- 대여 금액 = 일일요금 * 30 * (100 - 할인율) / 100, 소숫점은 버림처리
- 정렬 = 대여금액 DESC > 자동차 종류 ASC > 자동차 ID DESC
정답
SELECT C.CAR_ID, C.CAR_TYPE, FLOOR(C.DAILY_FEE * 30 * (100 - P.DISCOUNT_RATE) / 100) AS FEE
FROM CAR_RENTAL_COMPANY_CAR C
INNER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P
ON C.CAR_TYPE = P.CAR_TYPE
WHERE 1=1
AND P.DURATION_TYPE = '30일 이상'
AND C.CAR_TYPE IN ('세단', 'SUV')
AND NOT EXISTS (
SELECT 1
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H
WHERE 1=1
AND C.CAR_ID = H.CAR_ID
AND TO_CHAR(H.START_DATE, 'YYYYMMDD') <= '20221130'
AND TO_CHAR(H.END_DATE, 'YYYYMMDD') >= '20221101'
)
AND FLOOR(C.DAILY_FEE * 30 * (100 - P.DISCOUNT_RATE) / 100) BETWEEN 500000 AND 1999999
ORDER BY 3 DESC, 2, 1 DESC
참고사항
TO_DATE를 썼다가 시간 엄청썼다, TO_CHAR을 써줘야 하는가보다.
3중 JOIN으로 구현해보려고 했는데 생각보다 잘 안됐다.
728x90
반응형
'알고리즘 공부 > SQL' 카테고리의 다른 글
[L3] 프로그래머스 ORACLE 있었는데요 없었습니다 (0) | 2024.10.18 |
---|---|
[L3] 프로그래머스 ORACLE 없어진 기록 찾기 (0) | 2024.10.18 |
[L2] 프로그래머스 ORACLE 가격이 제일 비싼 식품의 정보 출력하기 (1) | 2024.10.18 |
[L2] 프로그래머스 MYSQL 연도별 대장균 크기의 편차 구하기 (0) | 2024.10.18 |
[L1] 프로그래머스 MYSQL 잡은 물고기 중 가장 큰 물고기의 길이 구하기 (0) | 2024.10.18 |