코딩테스트 연습 > String, Date > 자동차 평균 대여 기간 구하기
난이도: Lv.2
언어: MySQL
https://school.programmers.co.kr/learn/courses/30/lessons/157342
실패
SELECT a.CAR_ID, AVG(DATEDIFF(a.END_DATE, a.START_DATE) + 1, 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY a
WHERE 1=1
AND AVG(DATEDIFF(a.END_DATE, a.START_DATE) + 1, 1) > = 7
ORDER BY AVG(DATEDIFF(a.END_DATE, a.START_DATE) + 1, 1) DESC, a.CAR_ID DESC
실패이유
1. 연산자 띄어쓰기 실수
항상 보기 쉽게 ' + ' 등과 같이 띄어쓰기를 하는 습관이 있어, '> =' 연산자도 중간에 띄어쓰기를 하는 실수를 함.
2. 무지성 WHERE절 작성
같은 CAR_ID에 대해 묶어야하는데, 그 작업을 해주지 않았음!! (문제를 제대로 안 봄)
성공
SELECT a.CAR_ID, ROUND(AVG(DATEDIFF(a.END_DATE, a.START_DATE) + 1), 1) AS AVERAGE_DURACTION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY a
GROUP BY a.CAR_ID
HAVING AVERAGE_DURACTION >= 7
ORDER BY AVERAGE_DURACTION DESC, a.CAR_ID DESC
해결방안
1. GROUP BY 도입
CAR_ID 1, 2, 3, 4 등 각각에 대해 그룹으로 묶어주었습니다.
이렇게 묶인 GROUP 내의 값들은 AVG함수를 이용할 때 빛을 발휘하게 됩니다.
ROUND(반올림), AVG(평균), DATEDIFF(날짜 DAY 수의 차)로 각 CAR_ID에 대한 평균값을 구해주었습니다.
"GROUP BY를 통해 그룹으로 묶어서 하나의 그룹이 되었다면,
각 열들을 *으로 출력했을 때 그룹과 관계없던 열들은 어떤 값이 출력되는가?" 에 대한 내용은 접은 글에 두었습니다.
DB 기준 가장 초기에 적재된 데이터에 대한 값이 그룹의 열로 추가됩니다.
*참고 링크
https://www.inflearn.com/questions/185075/group-by%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C
2. HAVING 도입
GROUP BY에서 조건을 주기 위해서는 WHERE절이 아닌 HAVING절에 적어줍니다.
HAVING절 안에 각 CAR_ID에 대한 평균값이 7이상인 점을 명시해주었습니다.
3. ORDER BY를 후순위에 선언
ORDER BY는 GROUP BY보다 뒤에 선언해야합니다.
최종 데이터들에 대해 정렬하는 것이기 때문에 그룹으로 묶는 것 보다 후순위로 이루어집니다. ORDER BY를 앞쪽에 선언하면 아래와 같은 에러가 납니다.
SQL 실행 중 오류가 발생하였습니다.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY a.CAR_ID
HAVING AVERAGE_DURACTION >= 7' at line 4
*참고 chatGPT
없습니다.
코드에 질문이 있으시면 댓글을 달아주세요. 최대한 빠른 시일 내에 답변해드리겠습니다.
봐주셔서 감사합니다.
'Study > SQL' 카테고리의 다른 글
[프로그래머스 SQL] 가장 비싼 상품 구하기 (0) | 2024.01.11 |
---|---|
[프로그래머스 SQL] 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (0) | 2024.01.11 |
[프로그래머스 SQL] 조건에 부합하는 중고거래 상태 조회하기 (0) | 2024.01.11 |
[프로그래머스 SQL] 12세 이하인 여자 환자 목록 출력하기 (0) | 2024.01.11 |
[프로그래머스 SQL] 흉부외과 또는 일반외과 의사 목록 출력하기 (0) | 2024.01.11 |