sein-choi 님의 블로그
[SQL] Lv.3 대여 기록이 존재하는 자동차 리스트 구하기 본문
✅CAR_RENTAL_COMPANY_CAR

✅CAR_RENTAL_COMPANY_RENTAL_HISTORY

✅문제
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 자동차 종류가 '세단'인 자동차들 중 10월에 대여를 시작한 기록이 있는 자동차 ID 리스트를 출력하는 SQL문을 작성해주세요. 자동차 ID 리스트는 중복이 없어야 하며, 자동차 ID를 기준으로 내림차순 정렬해주세요.
SELECT C.CAR_ID
FROM CAR_RENTAL_COMPANY_CAR C INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID
WHERE H.START_DATE LIKE '%2022-10%' AND C.CAR_TYPE = '세단'
GROUP BY C.CAR_ID
ORDER BY C.CAR_ID DESC
CAR_RENTAL_COMPANY_CAR와 CAR_RENTAL_COMPANY_RENTAL_HISTORY를 공통된 컬럼 CAR_ID를 기준으로 INNER JOIN하여 두 테이블 모두 존재하는 데이터를 가져옵니다.
INNER JOIN을 사용한 이유는 대여 기록이 없는 자동차나 자동차 정보가 없는 대여 기록은 결과에 포함하지 않기 위해서 입니다.
WHERE 절을 통해 START_DATE가 10월인 기록과 CAR_TYPE이 '세단'인 자동차들을 필터링합니다.
CAR_RENTAL_COMPANY_RENTAL_HISTORY에는 CAR_ID가 CAR_RENTAL_COMPANY_CAR의 CAR_ID와 다르게 중복이 존재합니다. 자동차 대여 기록이기 떄문에 CAR_ID별로 여러번 대여한 기록이 존재할 수 있기 때문입니다. 이를 방지하고자 GROUP BY를 사용합니다.
🟧내 코드의 단점
STRAT_DATE가 '2022-10'을 포함하는 행을 찾는 조건을 만들었습니다. 이는 행마다 '2022-10'을 포함하는지 일일히 비교하기 떄문에 시간이 오래 걸립니다.
그리고 문제에서는 10월에 대여를 시작 기록이 있는 이라는 조건을 걸었습니다. 내가 2022라는 것을 포함한 이유는 데이터를 대략 보고 2022년 데이터구나를 예측하고 작성한 쿼리입니다. 만약 2022년 데이터가 아니였다면 내가 작성한 쿼리는 잘못되었을 것입니다.
✅다른 풀이
SELECT DISTINCT C.CAR_ID
FROM CAR_RENTAL_COMPANY_CAR C INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID
WHERE CAR_TYPE LIKE '%세단%'AND MONTH(START_DATE) = 10
ORDER BY C.CAR_ID DESC
MONTH(컬럼명(날짜 타입)): 월만 추출
MONTH(START_DATE)를 사용하여 START_DATE의 월만 추출하고, 이를 통해 START_DATE가 10월인 경우만 추출할 수 있습니다.
이 방법을 사용하면, 연도가 다르더라도 월이 10월인 경우만 데이터를 선택할 수 있습니다.
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
'QUIZ > [SQL]' 카테고리의 다른 글
| [SQL] Lv.3 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2025.03.05 |
|---|---|
| [SQL] Lv.3 조건에 맞는 사용자와 총 거래금액 조회하기 (0) | 2025.03.05 |
| [SQL] Lv.3 오랜 기간 보호한 동물(2) (0) | 2025.02.28 |
| [SQL] Lv.3 카테고리 별 도서 판매량 집계하기 (0) | 2025.02.27 |
| [SQL] Lv.3 있었는데요 없었습니다 (0) | 2025.02.27 |