728x90
반응형

안녕하세요!

오늘은 프로그래머스 SQL 고득점 Kit 중 GROUP BY 분야의 '대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기' 문제 리뷰를 진행하겠습니다.

 

문제는 아래 링크에서 확인해주시면 됩니다.

https://school.programmers.co.kr/learn/courses/30/lessons/151139

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • 문제 설명

 

  • 문제

 

  • 예시

728x90
  • 문제를 파악하며 쿼리 생각하기

예시에서 볼 수 있듯이, 저희가 문제에서 SELECT 해야하는 부분은 

  1. 월 : MONTH(START_TIME) AS MONTH
    → 문제에서 날짜의 기준을 대여 시작일로 하고 있기 때문에 START_TIME을 해줘야 합니다.
    → MONTH() 는 DATE 타입에서 월을 가지고 오는 명령어 입니다.
    → MONTH는 문제 조건에 맞게 별칭으로 지정한 것 입니다.
  2. 자동차 ID : CAR_ID
  3. 월별 대여 횟수 : COUNT(*) AS RECORDS
    → 대여 횟수를 구하기 위해서 COUNT 집계 함수를 사용합니다.
    → RECORDS는 문제 조건에 맞게 별칭으로 지정한 것 입니다.

총 3개인 것을 확인할 수 있습니다.

 

다음으로 저희가 WHERE 조건으로 확인해야 하는 부분은

  1. 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차
    → 조건이 복잡하기 때문에 서브 쿼리를 사용해야 합니다.
  2. 2022년 8월부터 2022년 10월 동안 : START_DATE BETWEEN '2022-08-01' AND '2022-10-31'

총 2개인 것을 확인할 수 있습니다.

 

이번 문제에서는 WHERE 절 조건이 복잡하기 때문에 서브 쿼리를 사용해야 합니다.

서브 쿼리에서 확인해야 하는 부분은

  1. 자동차 : WHERE CAR_ID IN (SELECT CAR_ID
    → WHERE 절에 서브 쿼리를 쓰실 때 주의해야 할 점은 SELECT 절에 반드시 비교하고자 하는 하나의 컬럼을 사용해야 하는 것입니다.
    → 문제에서는 특정 기간 동안 대여 횟수 5회 이상인 자동차라고 했기 때문에 WHERE 절에 CAR_ID가 와야 하고 이에 맞게 서브 쿼리 안에 SELECT 안에도 CAR_ID만 올 수 있습니다.
  2. 2022년 8월부터 2022년 10월 : WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
  3. 대여 횟수 5회 이상 :GROUP BY CAR_ID HAVING COUNT(*) >= 5)
    → 대여 횟수를 구하기 위해서 COUNT 집계 함수를 사용합니다.
    → 집계 함수 사용한 결과를 조건으로 걸어야 하기 때문에 HAVING을 사용합니다.
    → 집계 함수의 결과물을 사용할 수 없을 때, HAVING에서 바로 집계 함수를 사용하는 것이 가능합니다.

위와 같은 것을 확인할 수 있습니다.

다음으로 저희가 GROUP BY 해야하는 부분은

  1. 월별 자동차 대여 횟수 : GROUP BY MONTH(START_DATE), CAR_ID
    → 월별 대여 횟수이기 때문에 반드시 MONTH(START_DATE)를 해주셔야 합니다.
  2. 특정 월의 총 대여 횟수가 0인 경우 제외 : HAVING RECORDS != 0
    → 집계 함수의 결과를 조건으로 걸어야 하기 때문에 HAVING을 사용합니다.

위와 같은 것을 확인할 수 있습니다.

 

마지막으로 저희가 문제에서 확인해야 하는 부분은

  1. 월 기준 오름차순, 자동차 ID 기준 내림차순 : ORDER MONTH, CAR_ID DESC

총 1개인 것을 확인할 수 있습니다.

 

쿼리 완성하기

이제 위에서 생각한 쿼리를 SQL 실행 순서에 맞게 배치해주시면 됩니다.

그렇게 완성된 쿼리는 아래와 같습니다.

SELECT  MONTH(START_DATE) AS MONTH,
        CAR_ID,
        COUNT(*) AS RECORDS
FROM    CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE   CAR_ID IN (
        SELECT  CAR_ID
        FROM    CAR_RENTAL_COMPANY_RENTAL_HISTORY
        WHERE   START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
        GROUP BY 1
        HAVING COUNT(*) >= 5
        )
        AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY 1,2
HAVING RECORDS != 0
ORDER BY 1, 2 DESC

 

궁금한 부분이 있으신 분들은 댓글로 남겨주시면, 답변 드리도록 하겠습니다.

★읽어주셔서 감사합니다★

728x90
반응형

+ Recent posts