본문 바로가기
DB/문제풀이

[프로그래머스] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 -LV.3

by 쬑께께 2023. 2. 2.

해당 문제는 친구의 요청을 받아 레벨을 무시하고 푼 문제로 

문제 설명이 상당히 헷갈리게 작성되어있어

문제를 올바르게 파악하는 것이 상당히 중요하다...

아무튼 시작!

 

대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 문제는 다음과 같다.

 

 

이번 문제를 풀기에 앞서

주의해야 할 점은

해당 문제에서 원하는 바는

각 월당 대여횟수가 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번을 대여한 것을 확인할 수 있고,

각 월로 몇 번을 대여했는지 확인할 수 있게끔

결과가 수행되었다.

 

 

 

이제 정답인지 확인해보겠다.

정답이다.