코딩테스트 연습 > GROUP BY > 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
난이도: Lv.3
언어: MySQL
https://school.programmers.co.kr/learn/courses/30/lessons/151139
실패
실패1.
SELECT MONTH(a.START_DATE) AS MONTH, a.CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY a
WHERE 1=1
AND DATE_FORMAT(a.START_DATE, '%Y-%m') >= '2022-08'
AND DATE_FORMAT(a.END_DATE, '%Y-%m') <= '2022-10'
GROUP BY MONTH, a.CAR_ID
ORDER BY MONTH ASC, a.CAR_ID DESC
가장 먼저 짰었던 쿼리입니다.
이렇게 짜놓고 총 대여횟수가 5회 이상인 것을 어떻게 처리해야할 지에 대한 고민을 계속했습니다.
GROUP BY 이전에 집계함수를 이용해야할 것 같다는 판단이 계속해서 들었는데, WHERE절에서는 집계함수를 사용할 수가 없고... 어떻게 해야할지 고민에 빠졌습니다.
결국 이 문제는 혼자서 해결하지 못했습니다.. ㅠㅠ 1시간정도 붙들었는데 도저히 감이 안와서 답안을 보고 이해를 했습니다.
따라서 추후에 다시 풀어봐야할 문제입니다. 참고한 프로그래머스 링크는 더보기에 두었습니다.
답안을 보니 WHERE IN을 사용한 답이 많았습니다. 이 문제를 접하기 전에는 WHERE IN의 존재를 까맣게 잊고있었고, WHERE IN에 대해 알아보았습니다. 참고한 블로그는 더보기에 두었습니다.
실패2.
SELECT MONTH(a.START_DATE) AS MONTH, a.CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY a
WHERE a.CAR_ID IN (
SELECT b.CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY b
WHERE 1=1
AND DATE_FORMAT(b.START_DATE, '%Y-%m') >= '2022-08'
AND DATE_FORMAT(b.END_DATE, '%Y-%m') <= '2022-11'
GROUP BY b.CAR_ID
HAVING COUNT(b.CAR_ID) >= 5
)
GROUP BY MONTH, a.CAR_ID
ORDER BY MONTH ASC, a.CAR_ID DESC
위의 답안을 보고 코드를 변형시켰습니다. 그러나 실행하면 '틀렸습니다'가 자꾸 떴고, 그 이유에 대해 알아보았습니다.
실패이유1. 문제를 제대로 파악하지 않음
문제에는 아래와 같은 조건이 있었습니다.
'테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지'
이를 저는 시작날짜~끝나는 날짜를 판독하면 되겠다고 생각을 했으나, 조건은 시작 날짜에 대해서 날짜를 출력해야합니다.(시작 날짜에 대해 조건을 주어야 함)
따라서 WHERE절에 DATE_FORMAT으로 시작날짜, 종료날짜를 비교하는 것이 아닌 WHERE IN을 또 한번 채용하여 시작날짜에 대해 8, 9, 10을 판독해야함을 깨달았습니다.
실패이유2. 쿼리 조건을 WHERE IN 내부의 쿼리에만 적용함
시작날짜를 판독하는데있어 WHERE IN 내부에서만 쿼리를 적용했습니다.
이렇게 되면 7, 11월과 같이 조건에 맞지 않는 데이터가 존재한다고 가정한다면,
바깥 쿼리에서는 월에 상관 없이 해당 ID(a.CAR_ID)에 대해 다 검사하므로 원하지 않는 월의 데이터가 출력될 수 있습니다.
따라서 해당 쿼리에 AND 조건을 추가해주었습니다.
실패이유3. 문제에서 원하는 조건을 추가하지 않음
문제에는 아래와 같은 조건이 있었습니다.
'특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외'
당연히 WHERE IN 내부의 HAVING 절에서 COUNT가 5 이상인 것을 찾으니까 0이라는 데이터는 나오지 않을것이라고 생각했습니다.
그러나, 8월 - 4, 9월 - 1, 10월 - 0인 경우에 10월도 출력이 되는 쿼리라는 것을 깨달았습니다. 따라서 해당 조건을 바깥의 HAVING절에 추가하였습니다.
성공
위의 실패를 겪고 나서 최종 성공 코드입니다.
SELECT
MONTH(a.START_DATE) AS MONTH
, a.CAR_ID
, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY a
WHERE a.CAR_ID IN (
SELECT b.CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY b
WHERE MONTH(b.START_DATE) IN (8, 9, 10)
GROUP BY b.CAR_ID
HAVING COUNT(b.CAR_ID) >= 5
)
AND MONTH(a.START_DATE) IN (8, 9, 10)
GROUP BY MONTH, a.CAR_ID
HAVING COUNT(HISTORY_ID) > 0
ORDER BY MONTH ASC, a.CAR_ID DESC
*참고 chatGPT
없습니다.
코드에 질문이 있으시면 댓글을 달아주세요. 최대한 빠른 시일 내에 답변해드리겠습니다.
봐주셔서 감사합니다.
'Study > SQL' 카테고리의 다른 글
[프로그래머스 SQL] 오랜 기간 보호한 동물(1) (0) | 2024.01.15 |
---|---|
[프로그래머스 SQL] 카테고리 별 도서 판매량 집계하기 (0) | 2024.01.15 |
[프로그래머스 SQL] 고양이와 개는 몇 마리 있을까 (0) | 2024.01.15 |
[프로그래머스 SQL] 최댓값 구하기 (0) | 2024.01.12 |
[프로그래머스 SQL] 입양 시각 구하기(1) (0) | 2024.01.12 |