728x90
반응형
안녕하세요!
오늘은 프로그래머스 SQL 고득점 Kit 중 GROUP BY 분야의 '대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기' 문제 리뷰를 진행하겠습니다.
문제는 아래 링크에서 확인해주시면 됩니다.
https://school.programmers.co.kr/learn/courses/30/lessons/151139
- 문제 설명
- 문제
- 예시
728x90
- 문제를 파악하며 쿼리 생각하기
예시에서 볼 수 있듯이, 저희가 문제에서 SELECT 해야하는 부분은
- 월 : MONTH(START_TIME) AS MONTH
→ 문제에서 날짜의 기준을 대여 시작일로 하고 있기 때문에 START_TIME을 해줘야 합니다.
→ MONTH() 는 DATE 타입에서 월을 가지고 오는 명령어 입니다.
→ MONTH는 문제 조건에 맞게 별칭으로 지정한 것 입니다. - 자동차 ID : CAR_ID
- 월별 대여 횟수 : COUNT(*) AS RECORDS
→ 대여 횟수를 구하기 위해서 COUNT 집계 함수를 사용합니다.
→ RECORDS는 문제 조건에 맞게 별칭으로 지정한 것 입니다.
총 3개인 것을 확인할 수 있습니다.
다음으로 저희가 WHERE 조건으로 확인해야 하는 부분은
- 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차
→ 조건이 복잡하기 때문에 서브 쿼리를 사용해야 합니다. - 2022년 8월부터 2022년 10월 동안 : START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
총 2개인 것을 확인할 수 있습니다.
이번 문제에서는 WHERE 절 조건이 복잡하기 때문에 서브 쿼리를 사용해야 합니다.
서브 쿼리에서 확인해야 하는 부분은
- 자동차 : WHERE CAR_ID IN (SELECT CAR_ID
→ WHERE 절에 서브 쿼리를 쓰실 때 주의해야 할 점은 SELECT 절에 반드시 비교하고자 하는 하나의 컬럼을 사용해야 하는 것입니다.
→ 문제에서는 특정 기간 동안 대여 횟수 5회 이상인 자동차라고 했기 때문에 WHERE 절에 CAR_ID가 와야 하고 이에 맞게 서브 쿼리 안에 SELECT 안에도 CAR_ID만 올 수 있습니다. - 2022년 8월부터 2022년 10월 : WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
- 대여 횟수 5회 이상 :GROUP BY CAR_ID HAVING COUNT(*) >= 5)
→ 대여 횟수를 구하기 위해서 COUNT 집계 함수를 사용합니다.
→ 집계 함수 사용한 결과를 조건으로 걸어야 하기 때문에 HAVING을 사용합니다.
→ 집계 함수의 결과물을 사용할 수 없을 때, HAVING에서 바로 집계 함수를 사용하는 것이 가능합니다.
위와 같은 것을 확인할 수 있습니다.
다음으로 저희가 GROUP BY 해야하는 부분은
- 월별 자동차 대여 횟수 : GROUP BY MONTH(START_DATE), CAR_ID
→ 월별 대여 횟수이기 때문에 반드시 MONTH(START_DATE)를 해주셔야 합니다. - 특정 월의 총 대여 횟수가 0인 경우 제외 : HAVING RECORDS != 0
→ 집계 함수의 결과를 조건으로 걸어야 하기 때문에 HAVING을 사용합니다.
위와 같은 것을 확인할 수 있습니다.
마지막으로 저희가 문제에서 확인해야 하는 부분은
- 월 기준 오름차순, 자동차 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
반응형
'SQL > 프로그래머스' 카테고리의 다른 글
[SELECT] 조건에 맞는 개발자 찾기 (0) | 2024.09.09 |
---|---|
[SELECT] 서울에 위치한 식당 목록 출력하기 (2) | 2024.09.05 |
[GROUP BY] 저자 별 카테고리 매출액 집계하기 (1) | 2024.09.03 |
[JOIN] 있었는데요 없었습니다 (53) | 2024.04.11 |