본문 바로가기
오라클[ORACLE]

[오라클] GROUP BY 문법 완벽 정리 ( ORA-00979: GROUP BY 표현식이 아닙니다 )

by devlog93 2025. 12. 25.

1. GROUP BY란?

GROUP BY는 같은 값을 가진 행들을 하나의 그룹으로 묶어 집계 결과를 조회하는 문법이다. 주로 COUNT, SUM, AVG 같은 집계 함수와 함께 사용된다. 실무에서 주로 사용하므로 정확하게 알아가자!!!

2. GROUP BY 기본 문법

SELECT 컬럼, 집계함수
  FROM 테이블
 GROUP BY 컬럼;
  • GROUP BY에 명시된 컬럼 기준으로 그룹 생성
  • 그룹마다 하나의 결과 행 반환

3. 집계 함수 정리

함수 설명
COUNT 행 개수
SUM 합계
AVG 평균
MAX 최대값
MIN 최소값

 

4. GROUP BY 기본 예제

◆ 부서별 사원수

SELECT DEPT_ID
     , COUNT(*) AS EMP_CNT
  FROM EMP
 GROUP BY DEPT_ID;

DEPT_ID컬럼 기준으로 그룹을 생성하고 COUNT 결과를 반환.

 

5. ORA-00979: GROUP BY 표현식이 아닙니다

★ 가장 많이 발생하는 GROUP BY 에러

ORA-00979: GROUP BY 표현식이 아닙니다

!!! 에러 발생 조건

SELECT 절에 있는 컬럼이 GROUP BY에 없고 집계 함수로 감싸지지 않았을 때

 

에러 발생 예제

SELECT DEPT_ID
     , NAME
     , COUNT(*)
  FROM EMP
 GROUP BY DEPT_ID;

√  왜 에러가 날까?

  • DEPT_ID 기준으로 그룹화했는데
  • NAME은 여러 개 존재 가능
  • 오라클은 어떤 NAME을 출력해야 할지 결정할 수 없음

☞ 1. 해결 방법 ( 컬럼 제거 )

SELECT DEPT_ID
     , COUNT(*)
  FROM EMP
 GROUP BY DEPT_ID;

 

☞ 2. 해결 방법 ( GROUP BY에 컬럼 추가 )

◆ 이 경우 부서 + 이름별 그룹이 된다.

SELECT DEPT_ID
     , NAME
     , COUNT(*)
  FROM EMP
 GROUP BY DEPT_ID, NAME;

 

☞ 3. 해결 방법 ( 집계 함수 사용 )

◆ 임의의 하나를 집계 함수로 선택

SELECT DEPT_ID
     , MAX(NAME) AS NAME
     , COUNT(*)
  FROM EMP
 GROUP BY DEPT_ID;

 

6. GROUP BY 여러 컬럼 사용

SELECT DEPT_ID
     , JOB
     , COUNT(*) AS CNT
  FROM EMP
 GROUP BY DEPT_ID, JOB;

 

7. WHERE vs HAVING 차이 ( 에러 방지 중요 )

구분 WHERE HAVING
실행 시점 GROUP BY 이전 GROUP BY 이후
집계 함수 사용 불가 사용가능

 

※ 잘못된 예

SELECT DEPT_ID
     , COUNT(*) AS EMP_CNT
  FROM EMP
 WHERE COUNT(*) >= 3
 GROUP BY DEPT_ID;

왜 오류가 날까?

  • WHERE는 GROUP BY 이전에 실행됨
  • 아직 그룹이 만들어지기 전이라 COUNT(*) 같은 집계 함수를 사용할 수 없음
  • ORA-00934 또는 ORA-00979 오류 발생!!!

※ 올바른 예

SELECT DEPT_ID
     , COUNT(*) AS EMP_CNT
  FROM EMP
  GROUP BY DEPT_ID
 HAVING COUNT(*) >= 3

◆ 설명

  • 먼저 DEPT_ID로 그룹 생성
  • 그룹별 COUNT(*) 계산
  • 그 결과에 조건 적용

8. WHERE  GROUP BY HAVING 순서

FROM ㅡ> WHERE ㅡ> GROUP BY ㅡ> HAVING ㅡ> SELECT ㅡ> ORDER BY

 

9. GROUP BY 사용 시 핵심 규칙★

  • SELECT 절의 일반 컬럼 ㅡ> 반드시 GROUP BY
  • 집계 함수 ㅡ> GROUP BY 제외
  • 함수/ CASE WHEN 결과 ㅡ> 같은 표현식 그대로 GROUP BY
  • ORA-00979 = 99% SELECT 절과 GROUP BY 절 불일치 문제

마무리

GROUP BY는 SQL에서 많이 쓰이지만 동시에 ORA-00979에러가 가장 많이 발생하는 문법이기도 하다. 이 에러의 핵심은 SELECT에 쓴 모든 일반 표현식은 GROUP BY에 반드시 있어야 한다. 이 규칙만 기억해도 GROUP BY 관련 에러의 대부분은 바로 해결할 수 있을 것이다. 다음 글에서는 HAVING 문법을 더 깊게 그리고 집계 함수를 정리해 보려 한다. 감사합니다. (_ _)