HAVING 절 서브쿼리

호이·2025년 12월 16일

📘 HAVING 절 안에 서브쿼리를 넣어서 집계 결과를 비교하는 패턴

집계 쿼리를 쓰다 보면
HAVING AVG(...) >= 특정 값 같은 조건은 익숙하다.

그런데 이번에 쿼리를 짜면서
HAVING 안에서 다시 SELECT를 써서,
집계 결과끼리 비교할 수 있다는 걸 처음 제대로 인식했다.


1. 내가 원했던 조건의 형태

조건을 문장으로 쓰면 대략 이런 구조였다.

어떤 그룹의 평균 값이
다른 그룹(또는 전체)의 평균 값 이상일 것

여기서 중요한 점은
비교 대상이 고정된 숫자가 아니라
다른 집계 결과라는 점이다.


2. 처음에는 막연했던 부분

처음에는 이런 생각이 들었다.

  • 평균은 HAVING에서 거는 거고
  • 비교 기준은 어딘가에 미리 계산해 둬야 하나?

그런데 막상 정리해보니
HAVING 안에서 바로 서브쿼리를 써도 된다는 걸 깨달았다.


3. HAVING + SELECT 패턴

SELECT
  category
FROM data_table
GROUP BY category
HAVING AVG(metric) >= (
  SELECT AVG(metric)
  FROM data_table
);

구조를 보면 단순하다.

  • 바깥 쿼리
    → 그룹별 평균
  • 서브쿼리
    → 비교 기준이 되는 평균
  • HAVING
    → 두 집계 결과를 바로 비교

별도의 CTE나 임시 테이블 없이도
한 쿼리 안에서 해결할 수 있다.


4. 기준 집단이 따로 있을 때도 동일

비교 기준이 “전체”가 아니라
특정 조건을 만족하는 집단일 경우에도
형태는 같다.

HAVING AVG(metric) >= (
  SELECT AVG(metric)
  FROM data_table
  WHERE group_type = 'A'
)

기준만 서브쿼리에서 바꿔주면 된다.


5. 이 패턴이 떠오르는 순간

이제는 이런 문장이 보이면
이 패턴이 바로 떠오를 것 같다.

  • “평균 이상인 그룹만”
  • “전체 대비 성과가 좋은 경우”
  • “특정 카테고리 평균보다 높은 경우”

👉 집계 결과 vs 집계 결과 비교


6. 정리

  • HAVING 안에 서브쿼리를 넣을 수 있다
  • 집계 결과를 또 다른 집계 결과와 바로 비교할 수 있다
profile
호잇

0개의 댓글