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

[SQL-DATE] 프로그래머스 Lv. 2 자동차 평균 대여 기간 구하기 [다시 풀어 보기] 본문

SQL/다시 풀어 보기

[SQL-DATE] 프로그래머스 Lv. 2 자동차 평균 대여 기간 구하기 [다시 풀어 보기]

스위태니 2024. 12. 20. 20:20

문제 링크

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

 

프로그래머스

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

programmers.co.kr

틀린 코드

SELECT 
    CAR_ID,
    ROUND(AVG(END_DATE - START_DATE), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
WHERE AVERAGE_DURATION >= 7
ORDER BY 
    AVERAGE_DURATION DESC, 
    CAR_ID DESC;

정답 코드

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 AVERAGE_DURATION >= 7
ORDER BY 
    AVERAGE_DURATION DESC, 
    CAR_ID DESC;

수정해야 할 문제

 

  1. WHERE와 HAVING의 혼동:
    • AVERAGE_DURATION은 ROUND(AVG(...), 1)이라는 집계 함수 결과에서 계산되므로, 이를 필터링하려면 HAVING 절을 사용해야 한다.
    • WHERE 절에서는 집계 함수(AVG, SUM, 등`)를 사용할 수 없다.
  2. 잘못된 WHERE 위치:
    • WHERE 절은 GROUP BY 뒤에 나올 수 없다.

 

풀이 과정

  1. FROM: 테이블에서 데이터를 읽어온다.
  2. GROUP BY: CAR_ID를 기준으로 데이터를 그룹화한다.
  3. SELECT: 각 그룹에 대해 대여 기간 평균을 계산하고 반올림한다.
  4. HAVING: 평균 대여 기간이 7일 이상인 그룹만 필터링한다.
  5. ORDER BY: 결과를 정렬한다.

느낀점

  • 1월 10일이 END_DATE 이고 1월 1일이 START_DATE 이면 10일이 되어야 한다.
  • 하지만 무작정 빼버리면 9일이 차이가 난다.
  • 따라서 1을 더해야 하는 실수를 범할 수 있다.