우당탕탕 개발일지
[SQL] 프로그래머스 JOIN: 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(level 4) - 2회차 복습 완료 본문
💡문제 링크
너무 까다로워서 결국 다른 사람 답변을 본 문제..
💡SQL 코드 설계
CAR_RENTAL_COMPANY_CAR(C) 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY(H) 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN(P) 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.
일단 조건을 살펴보면
1. 자동차 종류가 '세단' 또는 'SUV'
-> WHERE C.CAR_TYPE IN ('세단', '트럭')
2. 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능
-> 이게 가장 까다로웠다..
2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하나는 건 현재 대여 기록 정보에서 END_DATE < '2022-11-01'이거나 START_DATE > '2022-11-30'인 레코드를 말한다.
이러한 조건을 만족하는 레코드를 뽑아내기 위해 WHERE C.CAR_ID NOT IN () 쿼리를 써준다.
()안에는 아래와 같이 들어간다.
WHERE C.CAR_ID NOT IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE END_DATE > '2022-11-01' AND START_DATE < '2022-12-01'
) AND P.DURATION_TYPE='30일 이상'
왜 IN으로 하면 안되지?라고 계속 생각했는데,
H 테이블에 CAR_ID가 중복되기 때문이다.
3. 30일간의 대여 금액이 50만원 이상 200만원 미만
-> 30일간의 대여금액이니까 30일동안 빌린다는 것을 일단 확인하고, DURATION_TYPE이 '30일 이상'이어야 한다.
출력해야할 것을 살펴보면
1. 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력
2. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬
💡SQL 코드
SELECT C.CAR_ID, C.CAR_TYPE, ROUND(C.DAILY_FEE*30*(100-P.DISCOUNT_RATE)/100) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS C
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS H ON C.CAR_ID=H.CAR_ID
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS P ON C.CAR_TYPE=P.CAR_TYPE
WHERE C.CAR_ID NOT IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE END_DATE > '2022-11-01' AND START_DATE < '2022-12-01'
) AND P.DURATION_TYPE='30일 이상'
GROUP BY C.CAR_ID
HAVING C.CAR_TYPE IN ('세단', 'SUV') AND (FEE>=500000 AND FEE<2000000)
ORDER BY FEE DESC, CAR_TYPE, CAR_ID DESC
💡기억할 내용
1. 너무 어렵다..
'SQL' 카테고리의 다른 글
[SQL] 비트연산자 - 2회차 복습 완료 (0) | 2024.07.02 |
---|---|
[SQL] 프로그래머스 SELECT : 부모의 형질을 모두 가지는 대장균 찾기(level 2) - 2회차 복습 완료 (1) | 2024.07.02 |
[SQL] 프로그래머스 JOIN: 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(level 4) (0) | 2024.07.02 |
[SQL] 프로그래머스 SELECT: 조건에 맞는 개발자 찾기(level 2) (0) | 2024.07.02 |
[SQL] 프로그래머스 String, Date : 분기별 분화된 대장균 수 구하기 (level 2) (0) | 2024.07.02 |