코딩테스트/SQL

[JOIN] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (☆☆)

영최 2024. 9. 10. 15:01
728x90

✅ 2번 JOIN 하는 대신 서브쿼리로 날짜조건으로 거른 다음 DISTICT사용함 (그래서 GROUPBY CAR_ID 사용 안함-중복행 문제)

서브쿼리 이점: 중간 결과 집합 최소화
JOIN을 사용하면 중간 결과로 큰 테이블이 생성될 수 있지만, 서브쿼리는 필요한 데이터만 필터링하여 반환합니다.이는 메모리 사용을 줄이고 전체적인 쿼리 실행 속도를 향상시킬 수 있습니다.

✅ DISTICT써서 HAVING절에 GROUPBY쓰지 않아도 됨 (일부 SQL허용 -MySQL)

✅ 11월 한 달 동안 대여 가능한 차량 조건 구하기

"11월 한 달 동안 대여 가능한 차량"입니다. 이를 논리적으로 표현하면 "11월 동안 대여되지 않은 차량"이 됩니다.

(END_DATE < '2022-11-01') OR (START_DATE > '2022-11-30')

이제 드모르간 법칙을 사용하면  
NOT (A OR B) = (NOT A) AND (NOT B)

NOT ((END_DATE < '2022-11-01') OR (START_DATE > '2022-11-30'))
= (NOT (END_DATE < '2022-11-01')) AND (NOT (START_DATE > '2022-11-30'))
= (END_DATE >= '2022-11-01') AND (START_DATE <= '2022-11-30')

 

 코드

-- 코드를 입력하세요
SELECT DISTINCT C.CAR_ID, C.CAR_TYPE, ROUND(30*C.DAILY_FEE*(100-P.DISCOUNT_RATE)/100) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS C
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-11-30'
)
AND C.CAR_TYPE IN ('세단','SUV')
AND P.DURATION_TYPE = '30일 이상'
HAVING 500000 <= FEE AND FEE < 2000000
ORDER BY FEE DESC, C.CAR_TYPE, C.CAR_ID DESC
728x90