-
[프로그래머스] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 - MySQLDataBase/MySQL 2023. 2. 19. 13:49
문제
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/151139
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 알고리즘 분류 - GROUP BY
- 난이도 - Level 3
관련 개념
HAVING
GROUP BY 에 조건을 걸 때 사용
GROUP BY 컬럼명 HAVING 조건
답안 코드
1) 서브쿼리 조인
SELECT MONTHLY_RECORDS.MONTH, MONTHLY_RECORDS.CAR_ID, MONTHLY_RECORDS.RECORDS FROM( SELECT MONTH(START_DATE) AS 'MONTH', HISTORY_ID, CAR_ID, START_DATE, END_DATE, COUNT(*) AS 'RECORDS' FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31' GROUP BY CAR_ID, MONTH(START_DATE) ) MONTHLY_RECORDS, ( SELECT CAR_ID, COUNT(*) AS 'RECORDS' FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31' GROUP BY CAR_ID ) TOTAL_RECORDS WHERE MONTHLY_RECORDS.CAR_ID = TOTAL_RECORDS.CAR_ID AND MONTHLY_RECORDS.RECORDS > 0 AND TOTAL_RECORDS.RECORDS >= 5 GROUP BY MONTHLY_RECORDS.MONTH, MONTHLY_RECORDS.CAR_ID ORDER BY MONTHLY_RECORDS.MONTH, MONTHLY_RECORDS.CAR_ID DESC
'특정 기간 내 자동차별 총 대여 횟수'와 '특정 기간 내 월별 자동차별 대여횟수'를 동시에 다루는 게 어려웠다. SUM과 COUNT를 조건으로 써야하는데 이 둘은 WHERE에서 쓸 수 없고, HAVING의 존재를 까먹었었기 때문이다.
그래서 일단 이렇게 풀어봤는데... 이렇게까지 길게 풀 문제가 맞나싶어서 다른 풀이를 참고하여 아래처럼 다시 풀어봤다.
2) WHERE, IN, 서브쿼리, HAVING
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' AND 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(*)>=5) GROUP BY MONTH, CAR_ID HAVING RECORDS > 0 ORDER BY MONTH, CAR_ID DESC
본 쿼리에서는 월별 대여횟수가 0 이상인 데이터를 가져오고, WHERE 절에서 IN과 서브쿼리를 사용해 총 대여횟수가 5회 이상인 데이터를 가져왔다.
'DataBase > MySQL' 카테고리의 다른 글
[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기 - MySQL (0) 2023.02.23 [프로그래머스] 자동차 대여 기록에서 장기/단기 대여 구분하기 - MySQL (2) 2023.02.19 [프로그래머스] 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (0) 2023.02.18 [MySQL] 특정 문자열 포함 여부, 횟수 찾기 - LIKE(), INSTR() (0) 2023.02.18 [프로그래머스] 평균 일일 대여 요금 구하기 - MySQL (0) 2023.02.18