https://school.programmers.co.kr/learn/courses/30/lessons/157339
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제



내 풀이
확실히 레벨이 오르니까 푸는 원리는 나름 쉬웠는데 하나 실수하니까 어디서 틀렸는지 찾기가 어려웠습니다.
디테일한 부분을 놓치지 않는 것도 실력인거겠죠?
풀다가 시간이 너무 오래 걸려서 다른 사람들의 코드를 조금 참조 했습니다.
제가 틀렸던 부분은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블의 날짜 조건을 잘못 설정했었는데요.
처음에 단순하게 시작 날짜에 상관없이 END_DATE가 11월 01일 이전에 속하면 모두 렌트 가능한 자동차라고 생각했습니다. 이러면 그 이후에 끝나는 데이터가 있어도 그냥 무시한 거라서요.
SELECT *
FROM (
SELECT CAR.CAR_ID, CAR.CAR_TYPE, ROUND(CAR.DAILY_FEE * 30 * (1-PLAN.DISCOUNT_RATE /100)) AS FEE
FROM CAR_RENTAL_COMPANY_CAR CAR
LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY HIS
ON CAR.CAR_ID = HIS.CAR_ID AND (END_DATE >= '2022-11-01')
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN PLAN
ON CAR.CAR_TYPE = PLAN.CAR_TYPE AND DURATION_TYPE = '30일 이상'
WHERE CAR.CAR_TYPE IN ('세단', 'SUV')
AND HIS.CAR_ID IS NULL
) A
WHERE FEE < 2000000 AND FEE >= 500000
ORDER BY FEE DESC, CAR_TYPE ASC, CAR_ID DESC
그래서 반대로 11-01일 이후에 끝나는 데이터가 있는 것들을 모두 끌어와서 LEFT JOIN 해주고 매칭되는 데이터가 없는 것이 렌트 가능한 데이터로 설정했습니다.
다른 사람의 코드를 보니 FEE에 대한 조건문 설정(50만원 이상, 200만원 미만)을 조금 짧은 코드로 쓰기 위해
위와 같이 따로 서브쿼리로 빼서 WHERE절과 ORDER BY절 조건문을 적용했습니다.
메모
프로그래머스 / SQL / JOIN / Lv4.
'SQL 문제풀이' 카테고리의 다른 글
| [MySQL | 프로그래머스] 이름이 있는 동물의 아이디 (0) | 2024.09.23 |
|---|---|
| [MySQL | 프로그래머스] 이름이 없는 동물의 아이디 (0) | 2024.09.20 |
| [MySQL | 프로그래머스] 오랜 기간 보호한 동물(1) (1) | 2024.09.07 |
| [MySQL | 프로그래머스] 상품 별 오프라인 매출 구하기 (0) | 2024.09.05 |
| [MySQL | 프로그래머스] 있었는데요 없었습니다 (0) | 2024.09.03 |