해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.

프로그래머스

해당 글에서는 서브쿼리와 GROUP BY를 이용하여 푸는 문제로 초보자가 하기에는 보통~어려움 정도의 난이도를 가지고 있습니다.

해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.

 

시작하겠습니다.


CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.

여기서 알아야 할 것은 2022-08 ~ 2022-10 까지의 총 대여 횟수가 5회 이상이여야 하는 것이 전제조건입니다.. 그리고 대여한 총 횟수를 넣는 것이 아닌 각각의 월에 해당 자동차를 대여한 횟수를 출력해야 하는 것입니다.(저는 계속 총 횟수를 넣는 바람에 시간을 많이 지체 하였습니다.)

 

즉, 간단하게 5회 이상 대여한 CAR_ID를 가져오고 조건문에 해당 CAR_ID를 넣어준 후 각각의 월에 빌린 카운트 수를 세어 주면 될 것 같습니다.

 

1. 조건에 맞는 CAR_ID 추출하기

SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(CAR_ID) >= 5

DATE_FORMAT을 쓰는 방법도 있으나 저는 이번에는 굳이 사용할 필요가 없다 생각 되어 직관적인 BETWEEN AND를 사용했습니다.

CAR_ID를 그룹으로 묶고 HAVING절을 사용하여 해당 CAR_ID의 카운트가 5개 이상인 값들만 추출하도록 만들어 주었습니다.

코드 결과

위의 코드 결과와 같이 5번 이상 대여한 자동차 목록들이 출력되었습니다. 이제 저희는 해당 CAR_ID만 이용하면 되는 것입니다.


2. WHERE 절에 추가하고 값 확인 하기

SELECT MONTH(START_DATE) AS MONTH
     , CAR_ID
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 CAR_ID
              HAVING COUNT(CAR_ID) >= 5)
    AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'

우선 맨 아래에 날짜 조건을 추가해준 이유는 WHERE절에서의 서브 쿼리에서 날짜 조건을 추가하여 CAR_ID를 가져오긴 하였으나, 해당 CAR_ID를 날짜조건을 추가해주지 않으면 11월 달에 대여한 CAR_ID가 있게 되면 그 값도 들어가게 되기 때문에 해당 조건을 추가해준 것입니다.

 

이렇게 해주면 각각의 MONTH에 해당하는 총 5회 이상 대여한 CAR_ID 값을 찾을 수 있습니다.

코드 결과


3. GROUP BY 후 카운트 수 세기

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 CAR_ID
              HAVING COUNT(CAR_ID) >= 5)
    AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY MONTH, CAR_ID
ORDER BY MONTH ASC, CAR_ID DESC

예를 들어서 8월에 CAR_ID가 15인 값들이 3개가 있다고 가정해보겠습니다. 그럼 저희는 RECORDS의 값이 3이 출력 되도록 해야 합니다.

이를 위해 GROUP BY를 할 때 CAR_ID 또는 MONTH 하나만 그룹핑 하는 것이 아닌 CAR_ID와 MONTH를 같이 그룹핑 해준 후 COUNT를 해주면 됩니다.

 

그리고 문제 조건에 맞게 정렬을 해주시면 해당 코드는 정답이 됩니다!


이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.

728x90
hmm06