몸과 마음이 건전한 SW 개발자

[SQL-GROUP BY] 프로그래머스 Lv. 3 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 [다시 풀어 보기] 본문

SQL/다시 풀어 보기

[SQL-GROUP BY] 프로그래머스 Lv. 3 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 [다시 풀어 보기]

스위태니 2024. 12. 23. 16:16

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

틀린 코드

WITH SUM_AUG_TO_OCT AS (
    SELECT
        CAR_ID,
        SUM(IF('2022-08-01' <= START_DATE AND START_DATE <= '2022-10-31', 1, 0)) AS COUNT_ALL
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    GROUP BY CAR_ID
), FIVE_MORE AS (
    SELECT
        MONTH(CRCRH.START_DATE) AS MONTH,
        CRCRH.CAR_ID,
        COUNT(*) AS RECORDS
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY CRCRH
    LEFT JOIN SUM_AUG_TO_OCT SATO
    ON CRCRH.CAR_ID = SATO.CAR_ID
    WHERE 8 <= MONTH(CRCRH.START_DATE) AND MONTH(CRCRH.START_DATE) <= 10
    GROUP BY CAR_ID
)
SELECT
    MONTH,
    CAR_ID,
    RECORDS
FROM FIVE_MORE
ORDER BY MONTH AND CAR_ID DESC;

정답 코드

WITH SUM_AUG_TO_OCT AS (
    SELECT
        CAR_ID,
        COUNT(*) AS TOTAL_RECORDS
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
    GROUP BY CAR_ID
    HAVING COUNT(*) >= 5
), MONTHLY_RECORDS AS (
    SELECT
        MONTH(START_DATE) AS MONTH,
        CAR_ID,
        COUNT(*) AS RECORDS
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
    GROUP BY MONTH(START_DATE), CAR_ID
)
SELECT
    MR.MONTH,
    MR.CAR_ID,
    MR.RECORDS
FROM MONTHLY_RECORDS MR
JOIN SUM_AUG_TO_OCT SATO
ON MR.CAR_ID = SATO.CAR_ID
ORDER BY
    MR.MONTH ASC,
    MR.CAR_ID DESC;

수정 과정

 

  1. SUM_AUG_TO_OCT 서브쿼리:
    • 2022년 8월~10월 사이의 START_DATE 기준으로 총 대여 횟수가 5회 이상인 자동차를 필터링했다.
    • HAVING COUNT(*) >= 5로 조건 추가.
  2. MONTHLY_RECORDS 서브쿼리:
    • 2022년 8월~10월 동안 월별로 자동차 ID와 대여 횟수를 계산했다.
  3. 최종 SELECT 및 정렬:
    • 조건을 만족하는 자동차 ID를 기준으로 월별 기록을 출력했다.
    • ORDER BY MR.MONTH ASC, MR.CAR_ID DESC를 통해 월 오름차순, 자동차 ID 내림차순 정렬을 적용했다.

 

느낀점

  • 그룹화할 때 조건을 정할 수 있으며 HAVING 함수를 사용하면 된다.