본문 바로가기

SQL/프로그래머스 SQL 고득점 kit

SQL 고득점 Kit / GROUP BY / 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 / MySQL

728x90

📚문제

출처 : 프로그래머스(https://school.programmers.co.kr/learn/courses/30/lessons/151139)

 

📝풀이

SELECT EXTRACT(MONTH FROM START_DATE) AS MONTH
      #MONTH(start_date) AS MONTH
     , CAR_ID
     , COUNT(*) RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

WHERE EXTRACT(MONTH FROM START_DATE) IN (8,9,10)
#WHERE DATE_FORMAT(start_date, "%Y-%m") BETWEEN '2022-08' AND '2022-10'
  AND CAR_ID IN (SELECT CAR_ID
                 FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                 WHERE EXTRACT(MONTH FROM START_DATE) IN (8,9,10)
                 GROUP BY CAR_ID
                 HAVING COUNT(*) >=5 )
GROUP BY EXTRACT(MONTH FROM START_DATE),CAR_ID
ORDER BY MONTH, CAR_ID DESC

어제 문제에서 잠깐 본 WHERE절 서브쿼리를 활용해서 푼 것이 너무 뿌듯하다...!!!

오래 안 걸려서 다행이다ㅎㅎ

 

한가지 주의해야 될 것은

출처 : https://velog.io/@jus6886/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EB%8C%80%EC%97%AC-%ED%9A%9F%EC%88%98%EA%B0%80-%EB%A7%8E%EC%9D%80-%EC%9E%90%EB%8F%99%EC%B0%A8%EB%93%A4%EC%9D%98-%EC%9B%94%EB%B3%84-%EB%8C%80%EC%97%AC-%ED%9A%9F%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0

 

나와 같은 실수를 하신 분이 계셔서 가져왔다

서브쿼리에서 8,9,10월 (3개월)에 걸쳐서 대여횟수가 5회이상인 차의 ID를 가져왔지만

본쿼리에서도 WHERE절에 8,9,10월이라는 조건을 걸지 않으면 7월에 대여횟수가 있을경우

SELECT EXTRACT(MONTH FROM START_DATE) AS MONTH

이 구문에서 7월이 같이 들어간다 뜻인것같다

 


SELECT MONTH(START_DATE) AS MONTH
     , CAR_ID
     , COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE MONTH(START_DATE) IN (8,9,10)
  AND CAR_ID IN (SELECT CAR_ID
                 FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                 WHERE MONTH(START_DATE) IN (8,9,10)
                 GROUP BY CAR_ID
                 HAVING COUNT(*) >= 5)
GROUP BY MONTH(START_DATE), CAR_ID
ORDER BY MONTH, CAR_ID DESC

 

이전에 풀었을 때랑 다르게

서브쿼리절 밖 메인쿼리에서도

WHERE절 필터링(8월,9월,10월)은 잊지 않고 잘 걸어주었다

 

근데 

급하게 문제를 풀다보니 이해를 어영부영하고 넘어가서 한 번 틀렸다

 

💡요점

우선 서브쿼리에서

8월,9월,10월 3개월에 걸쳐서 자전거를 대여한 횟수가 5회 이상인 ID를 찾는다

그 다음에 메인쿼리에서

월별/ID별로 그룹화하여 월별/ID별 몇회를 대여했는지를 구해야하는 문제이다

 

예를 들어서 CAR_ID 11이 3달에 걸쳐 총 6회 대여했다면

서브쿼리절에서 조건을 만족한 다음

메인쿼리에서

8월에 2번 

9월에 3번

10월에 1번

이런식으로 월별 대여횟수를 구해주면 된다

 

728x90