20240801 TIL
어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.
<문제>
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.
<나의 첫번째 풀이>
select month(start_date) as month,
car_id,
count(*) as records
from car_rental_company_rental_history
where start_date >= '2022-08-01' and start_date <= '2022-10-31'
group by month, car_id
having records >= 5
order by 1, 2 desc
<풀이>
1. 대여 시작일을 기준으로 2022년 8부터 10월까지 총 대여 횟수가 5회 이상인 자동차들
--> where start_date >= '2022-08-01' and start_date <= '2022-10-31'
--> having 절을 통해 대여횟수 구하기 (having records >= 5)
2. 월 별, 자동차 아이디 별 총 대여 횟수(컬럼명: records) 리스트 출력하기
--> 대여 횟수이기 때문에 count(*) as records
--> 월 별, 자동차 아이디 별로 그룹화 --> 미리 구해논 month와 car_id (group by month, car_id)
3. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬
--> order by 1, 2 desc
<결과값>
<나의 다른 풀이> - where 절에 서브쿼리를 이용하여 풀었다
select month(start_date) as month,
car_id,
count(*) as records
from car_rental_company_rental_history
where car_id in (select car_id
from car_rental_company_rental_history
where start_date >= '2022-08-01'
and start_date <= '2022-10-31'
group by car_id
having count(car_id) >= 5)
group by month, car_id
having records >= 1
order by month, car_id desc
<결과값>
그래도 결과는 처참히 오답 .... 아무리 생각해도 뭐가 틀린지 모르겠어서 구글링을 해봤다.
그렇게 찾게 된 어떤 분의 블로그! (참고 : https://velog.io/@dl-00-e8/Programmers-대여-횟수가-많은-자동차들의-월별-대여-횟수-구하기 )
이 분도 나와 비슷하게 어려움을 느끼고 계셨는데 결국 문제는 2022년 8월부터 2022년 10월 조건이 두 번 들어가야 하는 거였다.
그럼 왜 두 번 들어가는지 의문이 들었는데 저 블로그에서 잘 정리해주셔서 알게되었다.
<나의 최종 풀이>
select month(start_date) as month,
car_id,
count(*) as records
from car_rental_company_rental_history
where start_date >= '2022-08-01' and start_date <= '2022-10-31'
and car_id in (select car_id
from car_rental_company_rental_history
where start_date >= '2022-08-01'
and start_date <= '2022-10-31'
group by car_id
having count(car_id) >= 5)
group by month, car_id
having records >= 1
order by month, car_id desc
<결과 값>
즉, 메인 쿼리와 서브쿼리 두 번 다 조건을 걸어줘야 알맞은 결과값이 나온다.
📌참고 예시 ( 사이트는 아까 블로그와 동일)
대여 시작일이 8월 ~ 10월 사이가 아닌 데이터들이 존재한다면,
EX) 동일한 CAR_ID로 대여 시작일이 7월인 케이스가 한 건 이상 존재 + 8월 ~ 10월 사이 대여 케이스가 5건 이상
위와 같은 상황이라면, 메인 쿼리에 8월부터 10월 사이에 대한 WHERE 조건문이 없다면 COUNT(HISTORY_ID)의 집계값은 7월 케이스의 COUNT와 8월 ~ 10월 사이 케이스의 COUNT를 합한 값이 출력될 것이다.
즉, 출력되는 COUNT(HISTORY_ID)도 8월 ~ 10월 사이에 기간으로 제한을 둬야 문제의 조건에 맞게 8월 ~ 10월 사이에 대한 집계만 진행된다는 것을 알 수 있다.
점점 코드카타들이 어려워지고있다 .. 정말 기초 지식만 있는 나에게는 구글링이 필수가 되어가고 있는 것 같다.
구글링이 나쁘다는 건 아니지만 혼자 풀고 오답이 나오는 횟수가 늘어나니 자신감도 팍팍 떨어지는 느낌이다 .. ㅠ.ㅠ
시간날때 좀 어려웠던 코드카타들을 복습해보는 시간을 좀 가져야 할 것 같다.
'✨Today I Learned > MySQL' 카테고리의 다른 글
[MySQL] 우유와 요거트가 담긴 장바구니 (6) | 2024.07.23 |
---|---|
[MySQL] 자동차 대여 기록에 장기/단기 대여 구분하기 (1) | 2024.07.22 |
SQL codekata 58번 - 취소되지 않은 진료 예약 조회하기 (0) | 2024.07.16 |
SQL CODEKATA 55번 - 조건에 맞는 사용자 정보 조회하기 (0) | 2024.07.15 |
사전캠프 10일차 - SQL 5주차 정리 / SQL 코드카타 11번~19번 (0) | 2024.06.07 |