#2025-08-18 # GROUP BY와 집계 함수 쉽게 이해하기

데이터를 포지션별로 묶어서(그룹화) 처리할 때 왜 GROUP BY 뒤에는 그룹화 기준이 아닌 컬럼을 SELECT에 그대로 쓸 수 없는지, 그리고 집계 함수를 왜 써야 하는지를 아주 쉽게 풀어보겠습니다.


1. 예시 테이블

선수 이름포지션
홍길동골키퍼185
이순신수비수178
김철수수비수182
박영희공격수176
최민호공격수180

2. “포지션별 인원수” 구하기

먼저, “포지션별 인원수”만 보고 싶다면 이렇게 씁니다.

SELECT
  POSITION,       -- 포지션을 기준으로 묶고
  COUNT(*) AS 인원수  -- 각 그룹의 인원수를 센다
FROM PLAYER
GROUP BY POSITION;  -- 포지션별로 그룹화

결과:

POSITION인원수
골키퍼1
수비수2
공격수2

3. “키”를 함께 보려다 생기는 문제

포지션별 를 함께 보고 싶다고 해봅시다.

SELECT
  POSITION,
  COUNT(*) AS 인원수,
  HEIGHT         -- 문제의 핵심!
FROM PLAYER
GROUP BY POSITION;
  • 여기서 HEIGHT는 그룹화 기준이 아닙니다.
  • 예를 들어 “수비수” 그룹 안에는 키가 178, 182 두 개가 있는데, “수비수 한 줄에 키 하나”를 어떻게 정할까요?
  • SQL 입장에서는 “하나의 그룹당 컬럼값도 하나만 나와야” 오류가 나게 됩니다.

4. 그룹화된 결과에서 평균 키 구하기

여러 키를 하나의 값으로 요약하려면, 반드시 집계 함수를 사용해야 합니다. 평균 키(AVG), 최대 키(MAX), 최소 키(MIN), 합계(SUM) 등으로 숫자를 하나로 요약할 수 있습니다.

SELECT
  POSITION,
  COUNT(*)     AS 인원수,        -- 그룹별 인원수
  ROUND(AVG(HEIGHT), 2) AS 평균키  -- 그룹별 평균 키를 소수점 둘째 자리까지
FROM PLAYER
GROUP BY POSITION;

결과:

POSITION인원수평균키
골키퍼1185.00
수비수2180.00
공격수2178.00
  • AVG(HEIGHT)는 그룹 내 모든 키를 더한 뒤, 그룹 인원수로 나눈 값을 반환합니다.
  • 이렇게 하면 “수비수” 그룹은 (178 + 182) ÷ 2 = 180.0 이 되지요.

5. 결론 정리

  1. GROUP BY로 묶을 컬럼(예: POSITION)만 SELECT에 컬럼으로 쓸 수 있다.
  2. 그룹화되지 않은 다른 컬럼(예: HEIGHT)을 그대로 쓰려면, 여러 값을 하나로 요약하는 집계 함수(AVG, SUM, MAX, MIN 등)를 꼭 사용해야 한다.
  3. 요약 결과가 필요 없다면, 단순한 그룹화는 SELECT에 그 컬럼을 포함시킬 수 없다.

이 원칙만 기억하면, GROUP BY와 집계 함수 사용이 훨씬 쉬워집니다!