
데이터를 포지션별로 묶어서(그룹화) 처리할 때 왜 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 | 인원수 | 평균키 |
---|---|---|
골키퍼 | 1 | 185.00 |
수비수 | 2 | 180.00 |
공격수 | 2 | 178.00 |
AVG(HEIGHT)
는 그룹 내 모든 키를 더한 뒤, 그룹 인원수로 나눈 값을 반환합니다.- 이렇게 하면 “수비수” 그룹은 (178 + 182) ÷ 2 = 180.0 이 되지요.
5. 결론 정리
- GROUP BY로 묶을 컬럼(예: POSITION)만 SELECT에 컬럼으로 쓸 수 있다.
- 그룹화되지 않은 다른 컬럼(예: HEIGHT)을 그대로 쓰려면, 여러 값을 하나로 요약하는 집계 함수(AVG, SUM, MAX, MIN 등)를 꼭 사용해야 한다.
- 요약 결과가 필요 없다면, 단순한 그룹화는 SELECT에 그 컬럼을 포함시킬 수 없다.
이 원칙만 기억하면, GROUP BY
와 집계 함수 사용이 훨씬 쉬워집니다!