2026년 06월 23일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00979 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00979 not a GROUP BY expression 는?
ORA-00979 에러는 SELECT 절에 사용된 컬럼이나 표현식이 GROUP BY 절에 포함되지 않았을 때 발생하는 Oracle 데이터베이스 오류입니다. SQL의 집계 규칙에 따르면, SELECT 절에 집계 함수(SUM, COUNT, AVG 등)가 아닌 일반 컬럼을 사용할 경우 해당 컬럼은 반드시 GROUP BY 절에 명시되어야 합니다. 이 에러는 특히 복잡한 리포트 쿼리나 대시보드용 집계 쿼리를 작성할 때 빈번하게 발생하며, 초보 개발자뿐 아니라 숙련된 DBA도 실수할 수 있는 대표적인 SQL 문법 오류입니다.
주요 발생 원인
1. SELECT 절의 컬럼이 GROUP BY 절에 누락된 경우
가장 흔한 원인으로, SELECT 절에 여러 컬럼을 나열했지만 일부 컬럼을 GROUP BY 절에 추가하는 것을 잊었을 때 발생합니다. 예를 들어, 부서별 급여 합계를 조회하면서 부서명 외에 부서 코드도 SELECT에 포함했지만 GROUP BY에는 부서명만 적은 경우가 대표적입니다. 이는 쿼리가 길어지거나 컬럼 수가 많아질수록 더욱 자주 발생하는 실수입니다.
2. 표현식(Expression)이나 함수 결과를 GROUP BY에 정확히 일치시키지 않은 경우
SELECT 절에서 컬럼에 함수나 연산을 적용한 표현식을 사용할 경우, GROUP BY 절에도 동일한 표현식을 그대로 작성해야 합니다. 예를 들어 SUBSTR(column, 1, 3)처럼 가공된 값을 SELECT에 사용했다면 GROUP BY에도 동일하게 SUBSTR(column, 1, 3)을 기술해야 하며, 원본 컬럼명만 적으면 에러가 발생합니다. 표현식의 일부만 GROUP BY에 포함하거나 다르게 작성하면 Oracle은 이를 다른 표현식으로 인식합니다.
3. 서브쿼리나 인라인 뷰에서 집계 쿼리를 중첩할 때 외부 쿼리에서 GROUP BY를 생략한 경우
복잡한 다단계 집계 쿼리에서 내부 인라인 뷰의 컬럼을 외부 SELECT에서 가져올 때, 외부 쿼리에서도 동일한 GROUP BY 규칙이 적용됩니다. 개발자들이 내부 뷰에서 이미 집계가 끝났다고 착각하여 외부 쿼리의 GROUP BY를 누락하는 경우가 많습니다. 이는 운영 환경에서 복잡한 분석 쿼리를 작성할 때 특히 주의해야 하는 패턴입니다.
해결 방법
원인 1 해결: 누락된 컬럼을 GROUP BY에 추가
에러가 발생하는 쿼리:
-- ORA-00979 발생
SELECT department_id, department_name, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id;
-- department_name이 SELECT에 있지만 GROUP BY에 없음
수정된 쿼리:
-- 올바른 쿼리: SELECT의 모든 비집계 컬럼을 GROUP BY에 포함
SELECT department_id, department_name, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id, department_name;
원인 2 해결: 표현식을 GROUP BY에 동일하게 작성
에러가 발생하는 쿼리:
-- ORA-00979 발생
SELECT SUBSTR(hire_date, 1, 4) AS hire_year,
job_id,
COUNT(*) AS emp_count
FROM employees
GROUP BY hire_date, job_id;
-- SUBSTR 표현식이 아닌 원본 컬럼명 hire_date를 GROUP BY에 사용
수정된 쿼리:
-- 올바른 쿼리: SELECT의 표현식과 동일하게 GROUP BY 작성
SELECT SUBSTR(hire_date, 1, 4) AS hire_year,
job_id,
COUNT(*) AS emp_count
FROM employees
GROUP BY SUBSTR(hire_date, 1, 4), job_id;
원인 3 해결: 인라인 뷰와 외부 쿼리의 GROUP BY 정확히 적용
에러가 발생하는 쿼리:
-- ORA-00979 발생 (외부 쿼리에서 GROUP BY 규칙 위반)
SELECT dept_name, region, SUM(dept_total)
FROM (
SELECT d.department_name AS dept_name,
l.city AS region,
SUM(e.salary) AS dept_total
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id
GROUP BY d.department_name, l.city
) sub
GROUP BY dept_name;
-- 외부 쿼리에서 region이 SELECT에 있지만 GROUP BY에 없음
수정된 쿼리:
-- 올바른 쿼리: 외부 쿼리에도 SELECT의 모든 비집계 컬럼 포함
SELECT dept_name, region, SUM(dept_total) AS total_salary
FROM (
SELECT d.department_name AS dept_name,
l.city AS region,
SUM(e.salary) AS dept_total
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id
GROUP BY d.department_name, l.city
) sub
GROUP BY dept_name, region;
추가 팁: HAVING 절과의 혼동 방지
-- HAVING은 GROUP BY 이후의 집계 결과를 필터링할 때 사용
-- WHERE와 혼동하여 잘못 작성하면 별도의 에러 유발 가능
SELECT department_id,
SUM(salary) AS total_salary
FROM employees
WHERE salary > 3000 -- 집계 전 개별 행 필터링
GROUP BY department_id
HAVING SUM(salary) > 50000; -- 집계 후 그룹 필터링
예방 방법
1. SELECT 절 작성 후 GROUP BY를 반드시 체크리스트 방식으로 검증하기
쿼리 작성 시 SELECT 절의 모든 컬럼을 나열한 뒤, 집계 함수(SUM, COUNT, AVG, MAX, MIN)로 감싸지 않은 컬럼은 예외 없이 GROUP BY에 포함되어야 한다는 원칙을 습관화해야 합니다. 실무에서는 복잡한 쿼리일수록 SELECT 컬럼 목록과 GROUP BY 컬럼 목록을 나란히 비교하는 습관을 들이면 실수를 크게 줄일 수 있습니다. 개발 환경에서 SQL을 작성하는 IDE(SQL Developer, Toad 등)의 문법 검사 기능을 적극 활용하는 것도 좋은 방법입니다.
2. 컬럼 별칭(Alias)을 GROUP BY에 사용하지 않도록 주의하기
Oracle에서는 SELECT 절에서 정의한 컬럼 별칭을 같은 쿼리의 GROUP BY 절에서 참조할 수 없습니다. 일부 개발자가 SELECT SUBSTR(hire_date,1,4) AS hire_year ... GROUP BY hire_year처럼 별칭을 GROUP BY에 사용하면 에러가 발생합니다. 반드시 GROUP BY 절에는 원본 컬럼명이나 표현식을 그대로 사용해야 하며, 별칭 사용은 ORDER BY 절에서만 가능하다는 점을 기억해야 합니다.
관련 에러
- ORA-00937:
not a single-group group function— 집계 함수와 일반 컬럼을 GROUP BY 없이 함께 SELECT할 때 발생하며, ORA-00979와 함께 가장 자주 마주치는 집계 관련 에러입니다. - ORA-00934:
group function is not allowed here— WHERE 절이나 GROUP BY 절 내부에 집계 함수를 잘못 사용할 때 발생하며, HAVING 절을 사용해야 하는 상황을 WHERE에 작성했을 때 주로 나타납니다. - ORA-00935:
group function is nested too deeply— 집계 함수를 3단계 이상 중첩하려 할 때 발생하는 에러로, 복잡한 분석 쿼리에서 주의가 필요합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.