알쿼리즘 스터디: 특정 기간의 자동차 대여비용 구하기
2024. 5. 16. 17:02ㆍ전처리/SQL
01 문제 안내
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
02 정답 쿼리
1. CTE: 세단 또는 SUV의 30일 이상 가격 조건
WITH PRICE AS (SELECT CAR_ID, CAR.CAR_TYPE,
FLOOR(DAILY_FEE*((100-DISCOUNT_RATE)*0.01)*30) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS CAR
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS PLA
ON CAR.CAR_TYPE = PLA.CAR_TYPE
WHERE DURATION_TYPE = '30일 이상'
AND (CAR.CAR_TYPE = '세단' OR CAR.CAR_TYPE ='SUV')
AND (FLOOR(DAILY_FEE*((100-DISCOUNT_RATE)*0.01)*30) BETWEEN 500000 AND 1999999)
)
2. MAIN: 22년 11월에 대여가 가능한 조건
SELECT CAR.CAR_ID,
CAR.CAR_TYPE,
FLOOR(PRI.FEE) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS CAR
JOIN PRICE AS PRI
ON CAR.CAR_ID=PRI.CAR_ID
WHERE CAR.CAR_ID NOT IN (SELECT DISTINCT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE END_DATE >= '2022-11-01')
03 문제 해결
1. IN 이랑 OR의 결과가 다른 이유는?
- 문제는 괄호였다. AND 많을 때 AND, OR의 괄호를 항상 조심해야 한다.
- 괄호를 따로 주면 안되고 조건마다 AND () 먼저 작성하고 안에 입력하자.
2. 위 아래 WHERE 조건인 (CAR.CAR_TYPE = '세단' OR CAR.CAR_TYPE = 'SUV') 겹쳐서 하나 제거
3. 정수만 출력하는 것은 FLOOR()함수이다.
4. NOT IN (서브쿼리)가 유용했다. 반납일이 11-01보다 많다면 대여할 수 없음을 이용했다.
5. LEFT JOIN해도 자꾸 두 번씩 출력되는 이유는?
- 왼쪽 CAR_ID는 그대로 두는데 오른쪽 HISTORY부분이 같은 아이디당 렌탈 기록이 많음.
- 왼쪽이 변형되는 게 아니지만 대응되는 행이 여러개라 자아 분열될 수 밖에 없음.
'전처리 > SQL' 카테고리의 다른 글
알쿼리즘 스터디: 온/오프라인 판매 데이터 통합하기 (0) | 2024.06.21 |
---|---|
알쿼리즘 스터디: 배송예측 성공과 실패 여부 확인 (0) | 2024.05.23 |
알쿼리즘 스터디 : SQL 문제 내는 날 (0) | 2024.04.16 |
SQL 코드카타 : 69, 70, 71, 72번 문풀 > 보류 > 진행 (1) | 2024.03.31 |
SQLD 문풀 내용 정리 (시험장 요약본) (0) | 2024.03.04 |