728x90
[SQL(Structured Query Language)] - 데이터베이스 분석의 필수 도구, SQL 기본 명령어 마스터하기!(SQL 기초를 알고 싶다면 링크 참고)
SQL 학습 과정에서 WHERE
와 HAVING
의 사용 시점이 혼란스러울 수 있습니다. 대체로 WHERE
구문을 먼저 배우고 이를 충분히 이해한 후, HAVING
에 대한 예제를 통해 두 구문의 차이점을 명확히 이해하는 것이 중요합니다.
특히, HAVING
을 언제 사용해야 하는지에 대한 이해는, 프로그래머스의 실제 연습 문제를 풀어보는 과정에서 자연스럽게 얻어질 수 있습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/157342
❑ 문제
CAR_RENTAL_COMPANY_RENTAL_HISTORY
테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION
) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.
CAR_RENTAL_COMPANY_RENTAL_HISTORY
테이블 예시 (자세한 내용은 연습문제 링크에서 확인)
❑ 풀이 과정
요구 사항이 많지만 차근차근 풀어보면 어렵지 않습니다.
- 먼저,
조건
대여기간이 7일 이상인 조건이 아니라 vs _평균 대여 기간_이 7일 이상인 자동차ID →(평균) 이라는 단어로Group by
를 생각하고, 그 이후에평균 대여 기간의 7일 이상이라 (조건)
-Having
을 써야겠다는 생각을 했다면 잘한 것이다. (처음에 생각없이WHERE
을 썼는데 - 바로 오류 메시지 등장 ⚠️)
⛔ 오답-- WHERE은 전체 (From + Table)에 대한 조건 | 현재 문제에서는 Group by 평균 대여 기간이 7일 이상인 경우라서 Having을 사용해야 한다. -- SELECT car_id, ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) as AVERAGE_DURATION From CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) >=7 GROUP BY car_id ORDER BY ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) DESC, car_id DESC
- 평균 대여 기간 구하기 (
DATEDIFF
) : (MySQL기준) 날짜 사이의 기간을 구할 때 사용 (w3school 참조) + 대여기간 일수를 구하기위해+1
까지 해줍시다. SELECT DATEDIFF("2017-06-25", "2017-06-15"); -- Output 10
- 그 외 : AVG - 평균 | ROUND - 반올림 | as 이름을 변경
❑ SQL 코드 (💯정답)
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 ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) >=7
ORDER BY ROUND(AVG(DATEDIFF(end_date,start_date)+1),1) DESC, car_id DESC
결과
728x90
'데이터 분석 > SQL(Structured Query Language)' 카테고리의 다른 글
SQL Test 무료 연습 ! 프로그래머스(programmers) (0) | 2024.02.27 |
---|---|
데이터베이스 분석의 필수 도구, SQL 기본 명령어 마스터하기! (0) | 2024.02.27 |