본문 바로가기
코딩테스트/프로그래머스

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

by drCode 2023. 6. 9.
728x90
반응형

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

 

대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기'

문제

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서

 

① 대여 시작일을 기준으로

② 2022년 8월부터 2022년 10월까지

③ 총 대여 횟수가 5회 이상인 자동차들에 대해서

④ 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력

하는 SQL문을 작성해주세요.

 

⑤ 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요.

⑥ 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.

 

① ~ ③ 번과  ④번 쿼리를 나눠서 작성하는 생각을 해야한다.

 

⑤번 조건은 마지막에 정렬해도 되니 빼놓고 생각하자.

 

① ~ ③ 번 조건의 쿼리를 작성

SELECT 
        CAR_ID
        , COUNT(CAR_ID) AS CNT
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
 WHERE 1=1
   AND START_DATE BETWEEN DATE("2022-08-01") AND DATE("2022-10-31")
   AND END_DATE > DATE("2022-07-31")
 GROUP BY CAR_ID
 HAVING COUNT(CAR_ID) >= 5

이렇게 하면

대여 시작일 기준으로 22년 8월부터 10월까지 5번 이상 빌린 차량을 구할 수 있다.

 

 

④번 쿼리 작성

SELECT 
        COUNT(CAR_ID) AS CNT
        ,HISTORY_ID
        ,CAR_ID
        ,MONTH(START_DATE) AS MONTH
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
 WHERE 1=1
   AND START_DATE BETWEEN DATE("2022-08-01") AND DATE("2022-11-01") 
   AND END_DATE > DATE("2022-07-31") 
 GROUP BY HISTORY_ID, CAR_ID, START_DATE, END_DATE

이렇게 작성하면

월별 자동차별 사용 카운트가 나오게 된다.

근데 우리는 월별 자동차별 사용 카운트 합계를 구해야 한다.

 

이제 1~3번 쿼리와 4번을 조인하여 5번 조건을 추가하면 된다.

 

SELECT 
        CARMONTH.MONTH
        , FIVEOVER.CAR_ID
        , CARMONTH.RECORDS
FROM (
        SELECT 
                CAR_ID
                , COUNT(CAR_ID) AS CNT
          FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
         WHERE 1=1
           AND START_DATE BETWEEN DATE("2022-08-01") AND DATE("2022-10-31")
           AND END_DATE > DATE("2022-07-31")
         GROUP BY CAR_ID
         HAVING COUNT(CAR_ID) >= 5
     ) FIVEOVER
     , (
         SELECT SUM(GETSUM.CNT) AS RECORDS
                , GETSUM.CAR_ID AS CAR_ID
                , GETSUM.MONTH  AS MONTH
           FROM (
                 SELECT 
                        COUNT(CAR_ID) AS CNT
                        ,HISTORY_ID
                        ,CAR_ID
                        ,MONTH(START_DATE) AS MONTH
                  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                 WHERE 1=1
                   AND START_DATE BETWEEN DATE("2022-08-01") AND DATE("2022-11-01") 
                   AND END_DATE > DATE("2022-07-31") 
                 GROUP BY HISTORY_ID, CAR_ID, START_DATE, END_DATE
           ) GETSUM
          WHERE 1=1
          GROUP BY GETSUM.CNT, GETSUM.CAR_ID, GETSUM.MONTH
     ) CARMONTH
 WHERE 1=1
   AND FIVEOVER.CAR_ID = CARMONTH.CAR_ID
 ORDER BY CARMONTH.MONTH ASC, FIVEOVER.CAR_ID DESC;

728x90
반응형

댓글