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

kiki·2024년 1월 10일
0

프로그래머스

목록 보기
52/78

문제 링크

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

문제 설명

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

N차 시도 - 통과

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 DATE_FORMAT(START_DATE,'%Y-%m-%d') BETWEEN '2022-08-01' AND '2022-10-31'
        GROUP BY 1 
        HAVING COUNT(*)>4) 
    AND DATE_FORMAT(START_DATE,'%Y-%m-%d') BETWEEN '2022-08-01' AND '2022-10-31'
    GROUP BY 1,2
    HAVING COUNT(*)>0
    ORDER BY 1,2 DESC

조금 복잡한 코드가 됐다. MYSQL에도 IN을 사용할 수 있다는 것!
먼저 CAR_ID로 그룹화해서 총 렌탈 횟수가 5회 이상인 차의 ID를 뽑아내고, 그 ID에 해당하는 데이터들을 조회했다.
WHERE CAR_ID IN 서브쿼리를 사용해 가장 큰 문제를 해결했다.
그리고 날짜 범위는 DATE_FORMAT에 BETWEEN을 사용해서 해결했다. 다른 방법으로는 DATE_FORMAT(START_DATE,'%Y%m') IN (202208,202209,202210) 이와같이 IN을 사용하는 방법도 있다.

근데 뭔가 서브 쿼리랑 본 쿼리 부분에서 겹치는 게 많아서 간단하게 할 수 있는 방법이 있을 것도 같은데 없나...

궁금한 점

SELECT MONTH(START_DATE) AS MONTH,
    CAR_ID, 
    COUNT(*) AS RECORDS
    WHERE CAR_ID IN (SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
        WHERE DATE_FORMAT(START_DATE,'%Y-%m-%d') BETWEEN '2022-08-01' AND '2022-10-31'
        GROUP BY 1 HAVING COUNT(*)>4) F
    GROUP BY 1,2

아니 나는 서브쿼리에 alias(이름) 지정 안해주면 오류났었던 것 때문에 alias 지정해줬더니 이번엔 그것 때문에 오류가 났다!
뭔차이지??

0개의 댓글