https://school.programmers.co.kr/learn/courses/30/lessons/151139
서브 쿼리로 풀어야하는 문제입니다.
1.(2022년 8월~ 2022년 10월 대여 횟수가 5회 이상인 car_id를 가져오고) 서브쿼리
2.(월별,자동차id별 총 대여 횟수를 구해야합니다.월의 총 대여 횟수가 0인 경우 결과 제외) 메인쿼리
먼저, 2022년 8월 ~ 2022년 10월의 car_id 아이디를 불러옵니다.
car_id IN(SELECT car_id
FROM car_rental_company_rental_history WHERE date_format(start_date,'%Y-%m') BETWEEN '2022-08' AND '2022-10'
GROUP BY car_id
HAVING count(*) >= 5)
date_format으로 년 월만 보이게 변경해주고, WHERE절에서 2022년 8월 ~ 2022 10월 가져옵니다. 이제 car_id 별로 묶어주고, 대여 횟수가 5회인 데이터만 가져오면 1번은 끝입니다.
여기서 중요하게 가져와야하는 것은 IN은 OR 조건 이기 때문에 한가지 조건만 충족해도 가져온다는 것입니다. 대여 횟수가 5회 이상이고 날짜가 2022-08, 2022-10월인 데이터도 불러오지만, 그 데이터의 car_id 가 같은 데이터도 같이 불러오기 때문에 WHERE절에서 다시 2022-08, 2022-10월인 데이터를 가져와야 합니다.
WHERE
date_format(start_date, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
월, car_id , 대여횟수를 가져옵니다.
SELECT
month(start_date) month,
car_id,
count(*) RECORDS
FROM
car_rental_company_rental_history
월별, 자동차 id별 대여횟수를 불러와야하기에 GROUP BY 로 그룹을 만들어줍니다.
이제 특정 월의 총 대여 횟수가 0인 경우를 지워주고, 월 기준 오름차순, 자동차 id 기준 내림차순 해주면 정답입니다.
GROUP BY
month,
car_id
HAVING
records > 0
ORDER BY
month,
car_id DESC
이제 모두 합쳐줘야합니다. 서브쿼리는 WHERE절에 넣어주시면 됩니다.
정답
SELECT
month(start_date) month,
car_id,
count(*) RECORDS
FROM
car_rental_company_rental_history
WHERE
car_id IN (
SELECT
car_id
FROM
car_rental_company_rental_history
WHERE
date_format(start_date, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
GROUP BY
car_id
HAVING
count(*) >= 5
)
and date_format(start_date, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
GROUP BY
month,
car_id
HAVING
records > 0
ORDER BY
month,
car_id DESC