👩🏻💻 TODAY I LEARN
1. SQLD 시험 준비 ! 헷갈리는 개념들 정리
2. 어제 못 푼 코드카타 74번 타파하기
3. 파이썬 종합반 1주차 수강
1. SQLD 시험 준비 ! 헷갈리는 개념들 정리
https://rosenps3.tistory.com/35
문제를 풀 때마다 새로운 게 생긴다 . 포스팅 하나로 정리해두고 마지막 날 훑을 예정
2. 어제 못 푼 코드카타 74번 타파하기
Q. 조건을 모두 만족하는 car_id , car_type, 총대여료(FEE) 리스트 뽑아라.
조건 1. car_type이 '세단' 혹은 'suv'
조건 2. 2022년 11월 한 달동안 대여할 거임
조건 3. 총 대여료가 50만원 이상, 200만원 미만
정렬 기준: FEE desc, car_type asc, car_id desc
어제 6시부터 8시 다 되어서까지 풀다가 일단 접어둔 문제.
아니 여태 푼 것보다 어려운 건 맞는데 또 이렇게까지 오래걸릴 일은 아닐 거 같은 느낌이 들어..
그래서 더 속 상 해 . . . .
난 정말 바본가
이 길은 내 길이 아닌가 . . . . ..................

끝도 없는 자기검열과 자존감 바닥의 굴레에 빠지게 됨
그래서 깔 - 끔하게 멈췄다.
무작정 다른 분들 쿼리 보거나 구글링 하는 것보다
혼자서 논리적으로 그리고 차근차근 생각해보는 연습이 더 중요하니까..
.
.
.
^ ^
그래서 오늘은 이거 하나만 풀어도 성공이다 하는 마음으로 풀었다.
결과는 다행히 성공 !
- 내가 만든 쿼리
방법1. 조인 2번하고 따로 조건 주기
SELECT DISTINCT A.CAR_ID
,A.CAR_TYPE
,FLOOR(A.DAILY_FEE * (1-(A.DISCOUNT_RATE/100))) * 30 AS FEE
FROM
(
SELECT C.CAR_ID
,C.CAR_TYPE
,C.DAILY_FEE
,D.DISCOUNT_RATE
FROM CAR_RENTAL_COMPANY_CAR C
INNER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN D
ON C.CAR_TYPE = D.CAR_TYPE
WHERE C.CAR_TYPE IN ('세단','SUV')
AND D.DURATION_TYPE = '30일 이상'
) A
LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H
ON A.CAR_ID = H.CAR_ID
WHERE A.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')
HAVING FEE >= 500000 AND FEE < 2000000
ORDER BY FEE DESC, CAR_TYPE, CAR_ID DESC
⭐️ 막혔던 부분
1️⃣ 2022-11-01 ~ 2022-11-30 총 30일동안 대여 가능한 자동차를 뽑기 위한 조건
NOT IN 을 활용해서 저 기간동안 대여 예정인 자동차를 제외하는 게 더 깔끔하다.
그리고 그 조건은
대여일이 내가 반납하려는 날짜보다 앞이고 (START_DATE <= '2022-11-30')
AND
반납일이 내가 대여하려는 날짜보다 뒤일 때 (END_DATE >= '2022-11-01')
라는 것..
알고 보면 참 쉬운데 처음 접하면 어떻게 조건을 주어야 할지 아직 막막하다.
이런 문제들을 더 많이 풀어보면서 계속 사고해줘야 할 것 같다.
2️⃣ 테이블 A와 history 테이블을 left join ? inner join ??
대여기록이 없는 자동차도 당연히 대여할 수 있으니까 left 가 맞는 것 같은데..
혹시 몰라서 튜터님께 질문드렸더니
맞다고 하셨다. 논리적으로 잘 풀었다고 하셨다....
나 잘 하고 있구나..! 다행이댜 ....

그리고 튜터님이라면 어떻게 푸셨을지 궁금해서 질문드렸다.
- 튜터님 쿼리
방법2. 조인이 필요한 테이블만 조인. 조건은 한 번에.
SELECT
c.CAR_ID,
c.CAR_TYPE,
FLOOR(c.DAILY_FEE * (1 - d.DISCOUNT_RATE/100) * 30) AS FEE
FROM
CAR_RENTAL_COMPANY_CAR c
JOIN
CAR_RENTAL_COMPANY_DISCOUNT_PLAN d ON c.CAR_TYPE = d.CAR_TYPE
WHERE
c.CAR_TYPE IN ('세단', 'SUV')
AND d.DURATION_TYPE = '30일 이상'
AND 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'
)
HAVING
FEE BETWEEN 500000 AND 1999999
ORDER BY
FEE DESC,
c.CAR_TYPE ASC,
c.CAR_ID DESC;
어쩜 이렇게 깔끔하게 만드셨을까 ,, 따라해야지
"1. 일단 car 테이블과 discount 테이블 조인해주고
(=자동차마다 할인율을 알 수 있는 테이블을 만들어주고)
2. 그 안에서
세단 혹은 SUV 인 자동차를 30일 이상 빌렸을 때의 값만 필터링한 다음
3. 최종 대여료를 조건에 맞게 필터링 해라."
HISTORY 테이블을 조인할 필요가 없었다.
조건도 한 번에 주면 된다.
내 쿼리보다 훨씬 직관적이고, 간결하다. 정말 많이 배웠다.. !
이렇게 하나의 문제에도 다양한 접근 방식이 있다는 걸 많이 마주하면서
여러 개의 문을 하나하나 열어가는 느낌이 든다 , , ,
이제 문 그만.. 이었으면 좋겠다가도 보이면 열 수밖에 없다 ㅎ
무서워하지 말고 차근하게 문을 열어가보자.
하면 된다.
3. 파이썬 종합반 1주차 수강
코드카타 74번 확실하게 정리하고,
75번 풀다가 또 막혔다 ㅋ
오늘은 75번 고민하는 걸로 남은 시간을 채워보기로 했다.
내일은 정말 파이썬 시작해야지..
'데이터 분석 > SQL' 카테고리의 다른 글
| [day24] window 함수 - 비율 함수 (0) | 2025.03.11 |
|---|---|
| [day19] SQL 어려워도 슬퍼도 나는 안 우럭 .. / 파이썬 다시 시작 ! (0) | 2025.03.06 |
| [day13] SQLD 헷갈리는 부분 정리 ˚。・゚✧ (0) | 2025.03.01 |
| [day12] with recursive 재귀문 만들기 (0) | 2025.02.28 |
| [day11] 이런 속담이 있다. window 함수만 잘 사용하면 쿼리가 간단해진다는. (1) | 2025.02.27 |