해당 문제는 친구의 요청을 받아 레벨을 무시하고 푼 문제로
문제 설명이 상당히 헷갈리게 작성되어있어
문제를 올바르게 파악하는 것이 상당히 중요하다...
아무튼 시작!
대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 문제는 다음과 같다.



이번 문제를 풀기에 앞서
주의해야 할 점은
해당 문제에서 원하는 바는
각 월당 대여횟수가 5 이상인 컬럼값을 가져오는것이 아닌
8월에서 10월까지 합쳐서 대여횟수가 5 이상인 컬럼값을 가져와야 한다는거다.
(굳이 이렇게 구구절절하게 쓰는 이유는
처음에 각 월당 대여횟수가 5 이상인 컬럼값을 가져오는 쿼리문을 짰기 때문...)
아무튼 시작해보겠다.
이번 문제를 풀기 위해서는
1. 월, 자동차 ID, 대여횟수 출력
2. 대여기간이 2022-08 ~ 2022.10 사이인 결과물 출력
3. 2022-08 ~ 2022.10 사이의 대여횟수가 5 이상인 자동차 ID 출력
4. 월별, 자동차 ID별로 결과 묶기
5. 월 기준 오름차순 정렬
6. 월이 같다면 자동차 ID기준 내림차순 정렬
순으로 접근해야 한다.
우선 월, 자동차ID, 대여횟수를 출력시키겠다.
월만 출력시켜주기 위해 DATE_FORMAT( )를 사용해주었고,
대여횟수의 경우 그 달에 대여를 했는지 확인할 수 있는 컬럼을
COUNT( )에 삽입해주면 된다.

다음으로는
대여기간이 2022-08 ~ 2022-10
사이인 값들을 들고와주겠다.

다음으로는 대여기간이 2022-08 ~ 2022-10 사이이면서
해당 기간 사이의 대여횟수가 5 이상인 자동차 ID를 출력시키겠다.
처음에 풀었던 방식은 다음과 같은데

해당 쿼리문을 실행하게 되면
각 월별 CAR_ID의 대여횟수가 아닌
8월부터 10월 사이의 CAR_ID별 대여횟수가 나오게 된다.
또한, 다음과 같이 쿼리문을 짜게되면

8월달에 대여횟수가 5 이상인 CAR_ID,
9월달에 대여횟수가 5 이상인 CAR_ID ... 가
출력된다.
그러나 문제에서 원하는 바는
8월에서 10월사이의 대여횟수를 합쳤을 때 5 이상인
CAR_ID를 출력시켜주되,
각 월 당 몇 번을 대여했는지 같이 출력해달라는 것이다.
따라서 이를 위해선 서브쿼리문을 사용해주어야 한다...
CAR_ID의 대여시작일이 2022-08 ~ 2022-10사이여야 하며
이를 CAR_ID로 묶되, CAR_ID로 묶어놓은 시작 대여일 갯수가
5 이상인 CAR_ID만 출력되어야 한다.
따라서 이를 서브쿼리문으로 작성하면 아래와 같이 된다.

그리고 이를 본 쿼리문의 CAR_ID에 대입하게 되면
아래와 같은 쿼리문이 나오게 된다.
(구하고자 하는 바가 2022-08 ~ 2022-10서이이면서
CAR_ID의 총 대여횟수가 5 이상이어야 하니 AND연산자로 묶어주어야 한다.)

여기서 자세히 보면
본 쿼리문에도 START_DATE BETWEEN '2022-08-01' AND '2022-10-31'이 존재하며
서브 쿼리문 내에도 START_DATE BETWEEN '2022-08-01' AND '2022-10-31' 이 존재함을
볼 수 있다.
서브쿼리문에서의 월 지정은
서브쿼리문 내의 결과를 위해서인데
이 결괏값이 본 쿼리문으로 넘어오면서
전체에 해당하는 월(1월 ~ 12월)이 불러와진다.
그렇기 때문에 본 쿼리문에서도 월을 지정해주는 조건이 필요한 것이다.
(만일 이 이유가 아니라면 알려주세요...)
이제 다시 본 쿼리문으로 넘어와
월별, 자동차 ID별로 결과를 묶어주도록 하겠다.

그리고 마지막으로 정렬을 해주겠다.
월 기준으로 오름차순 정렬을 해주어야 하고,
만일 월이 같다면 자동차 ID기준으로 내림차순 정렬을 해주어야 하니
이를 쿼리문으로 바꿔주면 다음과 같이 된다.

이번 쿼리문을 실행시키면
다음과 같은 결과가 나온다.


CAR_ID 28번을 예로 보면
8월과 9월의 대여횟수를 합쳐보면 총 5번을 대여한 것을 확인할 수 있고,
각 월로 몇 번을 대여했는지 확인할 수 있게끔
결과가 수행되었다.
이제 정답인지 확인해보겠다.

정답이다.
'DB > 문제풀이' 카테고리의 다른 글
| [프로그래머스] 조건에 맞는 도서와 저자 리스트 출력하기 -LV.2 (0) | 2023.02.21 |
|---|---|
| [프로그래머스]성분으로 구분한 아이스크림 총 주문량 -LV.2 (0) | 2023.02.20 |
| [프로그래머스] 재구매가 일어난 상품과 회원 리스트 구하기 -LV.2 (0) | 2023.02.01 |
| [프로그래머스] 자동차 대여 기록에서 장기/단기 대여 구분하기 -LV.1 (0) | 2023.01.31 |
| [프로그래머스] 가격대 별 상품 개수 구하기 -LV.2 (0) | 2023.01.26 |