바뀐 쿼리를 보면 이전 쿼리에서 오류가 발생한 WHERE 절의 조건 COUNT(*) > 1을 HAVING 절로 옮겼습니다. HAVING 절은 GROUP BY 절 다음에 위치하고 집계 함수의 결괏값을 조건으로 넣을 수 있습니다. 결과를 보면 매출액 1~10위의 영화 중 2편 이상 개봉한 연월이 조회됐습니다.
다른 예를 봅시다.
코드 7-25
SELECT EXTRACT(YEAR_MONTH FROM release_date) 개봉연월, COUNT(*) 개봉편수,
ROUND(SUM(sale_amt) / 100000000) 금액_억원
FROM box_office
WHERE 1 = 1
AND ranks BETWEEN 1 AND 10
GROUP BY EXTRACT(YEAR_MONTH FROM release_date)
HAVING ROUND(SUM(sale_amt) / 100000000) >= 1500
ORDER BY 1;
실행결과
코드 7-25는 코드 7-24를 조금 변형했습니다. 먼저 SELECT 절에서 SUM() 함수로 매출액을 합산합니다. 매출액 단위가 커서 합산한 금액을 1억으로 나눈 다음 ROUND() 함수로 반올림하고요. 그리고 HAVING 절에 SELECT 절에서 ROUND()와 SUM() 함수로 구한 결괏값이 1500보다 크거나 같다는 조건을 주었습니다. 이는 무슨 의미일까요? 이 쿼리는 1~10위 영화의 개봉연월별 개봉편수와 매출액 합계를 구하고, 이 중에서 합계를 반올림한 금액이 1,500억 원 이상인 건을 조회합니다.