문제 설명
다음은 어느 자동차 대여 회사에서 대여 중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블과 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 자동차 종류별 대여 기간 종류별 할인 정책 정보를 담은 CAR_ RENTAL_COMPANY_DISCOUNT_PLAN 테이블입니다. CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어있으며, CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS 는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.
Column name | Type | Nullable |
CAR_ID | INTEGER | FALSE |
CAR_TYPE | VARCHAR(255) | FALSE |
DAILY_FEE | INTEGER | FALSE |
OPTIONS | VARCHAR(255) | FALSE |
자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진' 이 있습니다. 자동차 옵션 리스트는 콤마(', ')로 구분된 키워드 리스트(예: ''열선시트, 스마트키, 주차감지센서'')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '내비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트'가 있습니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.
문제 풀이
SELECT
c.CAR_ID,
c.CAR_TYPE,
ROUND(c.DAILY_FEE * (1 - d.DISCOUNT_RATE / 100.0) * 30) AS FEE
FROM
CAR_RENTAL_COMPANY_CAR c
LEFT JOIN
CAR_RENTAL_COMPANY_RENTAL_HISTORY h ON c.CAR_ID = h.CAR_ID AND
(h.START_DATE <= '2022-11-30' AND h.END_DATE >= '2022-11-01')
LEFT JOIN
CAR_RENTAL_COMPANY_DISCOUNT_PLAN d ON c.CAR_TYPE = d.CAR_TYPE AND d.DURATION_TYPE = '30일 이상'
WHERE
c.CAR_TYPE IN ('세단', 'SUV') AND
h.CAR_ID IS NULL
HAVING
FEE >= 500000 AND FEE < 2000000
ORDER BY
FEE DESC,
c.CAR_TYPE,
c.CAR_ID DESC;
- SELECT:
- c.CAR_ID: 차량의 ID
- c.CAR_TYPE: 차량의 유형
- ROUND(c.DAILY_FEE * (1 - d.DISCOUNT_RATE / 100.0) * 30) AS FEE: 차량의 일별 임대료를 바탕으로 한 월 임대료. 할인율이 적용된다면 그에 따른 할인 금액을 차감하여 계산합니다.
- FROM:
- CAR_RENTAL_COMPANY_CAR c: 차량 정보 테이블
- LEFT JOIN:
- CAR_RENTAL_COMPANY_RENTAL_HISTORY h: 차량 임대 기록 테이블. c.CAR_ID와 일치하는 데이터를 찾아 연결하며, 특정 날짜 조건 (2022-11-01부터 2022-11-30 사이)에 대한 임대 기록이 있는지 확인합니다.
- CAR_RENTAL_COMPANY_DISCOUNT_PLAN d: 차량 유형별 할인 계획 테이블. c.CAR_TYPE와 일치하며, 30일 이상 대여에 해당하는 할인율 데이터를 찾아 연결합니다.
- WHERE:
- 차량 유형이 '세단' 또는 'SUV'인 경우만 선택합니다.
- 위에서 LEFT JOIN 한 임대 기록 테이블에서 해당 차량에 대한 11월 임대 기록이 없는 경우만 선택합니다.
- HAVING:
- 계산된 월 임대료(FEE)가 500,000 이상 2,000,000 미만인 경우만 선택합니다.
- ORDER BY:
- 월 임대료를 내림차순으로 정렬합니다.
- 그 후 차량 유형으로 정렬합니다.
- 마지막으로 차량 ID를 내림차순으로 정렬합니다.
'SQL > SQL 테스트 연습' 카테고리의 다른 글
프로그래머스 Lv5. 상품을 구매한 회원 비율 구하기 (1) | 2023.08.19 |
---|---|
프로그래머스 Lv4. 입양 시각 구하기(2) (0) | 2023.08.16 |
프로그래머스 Lv4. 오프라인/온라인 판매 데이터 통합하기 (0) | 2023.08.16 |
프로그래머스 Lv4. 그룹별 조건에 맞는 식당 목록 출력하기 (0) | 2023.08.16 |
프로그래머스 Lv4. 저자 별 카테고리 별 매출액 집계하기 (0) | 2023.08.16 |