코딩테스트 연습에 공개된 문제는 (주)그렙이 저작권을 가지고 있습니다.
(지문 하단에 별도 저작권 표시 문제 제외)
코딩테스트 연습 문제의 지문, 테스트케이스, 풀이 등과 같은 정보는 비상업적, 비영리적 용도로 게시할 수 있습니다.

문제 정보

  • 프로그래머스
  • MySQL
  • level 2
  • 점수 : 해당 없음
  • 문제 링크

문제

다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

Column name Type Nullable
HISTORY_ID INTEGER FALSE
CAR_ID INTEGER FALSE
START_DATE DATE FALSE
END_DATE DATE FALSE

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.

풀이 코드

1
2
3
4
5
6
SELECT CAR_ID,
       ROUND(AVG(DATEDIFF(END_DATE, START_DATE)+1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(DATEDIFF(END_DATE, START_DATE) + 1) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;

풀이 방식

아래 네 단계로 풀이를 진행했다.

(1) 무엇을 반환해야 하는가
(2) 어떠한 데이터 뭉치에서 데이터를 조회해야 하는가
(3) 어떤 조건의 데이터를 가져와야 하는가
(4) 가져온 데이터를 어떻게 표현해야 하는가

(1) 무엇을 반환해야 하는가

1
2
3
-- CAR_ID와 평균 대여기간을 반환해야 한다.
SELECT CAR_ID,
       ROUND(AVG(DATEDIFF(END_DATE, START_DATE)+1), 1) AS AVERAGE_DURATION

(2) 어떠한 데이터 뭉치에서 데이터를 조회해야 하는가

1
2
-- FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

(3) 어떤 조건의 데이터를 가져와야 하는가

1
2
3
-- 평균 대여 기간이 7일 이상인 자동차들을 반환해야 한다.
-- "평균" 을 구해야 한다는 건 곳 Grouping 을 의미하므로 HAVING 절로 작성
HAVING AVG(DATEDIFF(END_DATE, START_DATE) + 1) >= 7

(4) 가져온 데이터를 어떻게 표현해야 하는가

1
2
-- 평균 대여 기간 내림차순, 자동차 ID 내림차순  
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;

리뷰

GROUP BY 와 HAVING 을 연습할 수 있는 연습 문제