2026년 06월 20일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00937 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00937 not a single-group group function 는?
ORA-00937 에러는 SQL 쿼리에서 GROUP BY 절 없이 집계 함수(SUM, COUNT, AVG, MAX, MIN 등)와 일반 컬럼을 함께 SELECT 절에 사용할 때 발생하는 오류입니다. Oracle 데이터베이스는 집계 함수가 전체 결과셋을 하나의 그룹으로 처리하는 반면, 일반 컬럼은 행 단위로 값을 반환하기 때문에 이 두 가지를 동시에 처리할 수 없어 에러를 발생시킵니다. 실무에서 매우 빈번하게 발생하는 에러 중 하나로, SQL 초보자뿐 아니라 숙련된 개발자도 복잡한 쿼리 작성 시 종종 실수하는 오류입니다.
주요 발생 원인
1. GROUP BY 절 없이 집계 함수와 일반 컬럼 혼용
가장 흔한 원인으로, SELECT 절에 집계 함수(SUM, COUNT 등)와 집계되지 않은 일반 컬럼을 함께 사용하면서 GROUP BY 절을 누락한 경우입니다. Oracle은 집계 함수를 사용할 경우 모든 비집계 컬럼이 GROUP BY 절에 명시되어야 한다는 규칙을 엄격하게 적용하며, 이를 어기면 즉시 ORA-00937 에러를 반환합니다.
-- 에러 발생 예시
SELECT department_id, COUNT(*) AS emp_count
FROM employees;
-- ORA-00937: not a single-group group function
-- 올바른 쿼리
SELECT department_id, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id;
2. SELECT 절의 컬럼이 GROUP BY 절에 누락된 경우
GROUP BY 절을 사용하더라도 SELECT 절에 있는 모든 비집계 컬럼이 GROUP BY 절에 포함되지 않으면 동일한 에러가 발생합니다. 예를 들어 SELECT 절에 세 개의 일반 컬럼을 명시했지만 GROUP BY 절에는 두 개만 포함한 경우, 나머지 하나의 컬럼이 어떤 값을 반환해야 할지 Oracle이 판단할 수 없어 에러가 발생합니다.
-- 에러 발생 예시 (job_id가 GROUP BY에 누락)
SELECT department_id, job_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id;
-- ORA-00937: not a single-group group function
-- 올바른 쿼리
SELECT department_id, job_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id, job_id;
3. 서브쿼리 또는 복잡한 쿼리에서의 집계 함수 중첩 오류
복잡한 쿼리를 작성할 때 서브쿼리 내부 또는 HAVING 절에서 집계 함수를 잘못 사용하거나, 중첩 집계 함수(집계 함수 안에 집계 함수)를 직접 사용하려 할 때도 이 에러가 발생할 수 있습니다. 특히 분석 함수(OVER 절 사용)와 일반 집계 함수를 혼용할 때 GROUP BY 구성이 맞지 않으면 ORA-00937이 발생하므로 주의가 필요합니다.
-- 에러 발생 예시 (중첩 집계 함수 직접 사용)
SELECT department_id, MAX(AVG(salary))
FROM employees
GROUP BY department_id;
-- ORA-00937: not a single-group group function
-- 올바른 방법 (서브쿼리 활용)
SELECT MAX(avg_salary)
FROM (
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
);
-- 분석 함수를 사용한 올바른 예시
SELECT department_id, employee_id, salary,
AVG(salary) OVER (PARTITION BY department_id) AS dept_avg_salary
FROM employees;
해결 방법
원인 1 해결: GROUP BY 절 추가
SELECT 절에 집계 함수와 일반 컬럼이 함께 있다면, 반드시 GROUP BY 절에 모든 비집계 컬럼을 명시해야 합니다.
-- 수정 전 (에러)
SELECT e.department_id, d.department_name, SUM(e.salary) AS total_sal
FROM employees e
JOIN departments d ON e.department_id = d.department_id;
-- 수정 후 (정상)
SELECT e.department_id, d.department_name, SUM(e.salary) AS total_sal
FROM employees e
JOIN departments d ON e.department_id = d.department_id
GROUP BY e.department_id, d.department_name;
원인 2 해결: GROUP BY 절에 누락된 컬럼 추가
-- 수정 전 (에러)
SELECT department_id, job_id, manager_id, COUNT(*) AS cnt
FROM employees
GROUP BY department_id, job_id;
-- 수정 후 (정상) - manager_id 추가
SELECT department_id, job_id, manager_id, COUNT(*) AS cnt
FROM employees
GROUP BY department_id, job_id, manager_id;
-- 대안: manager_id를 집계 함수로 처리
SELECT department_id, job_id,
MAX(manager_id) AS sample_manager_id,
COUNT(*) AS cnt
FROM employees
GROUP BY department_id, job_id;
원인 3 해결: 서브쿼리 또는 분석 함수로 대체
중첩 집계가 필요한 경우 서브쿼리를 활용하거나, 분석 함수(Window Function)를 사용하면 GROUP BY 없이도 유연하게 처리할 수 있습니다.
-- 부서별 평균 급여 중 가장 높은 값 찾기
SELECT MAX(avg_sal) AS max_of_avg
FROM (
SELECT department_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY department_id
);
-- 각 직원의 급여와 부서 평균 급여를 함께 조회 (분석 함수 활용)
SELECT employee_id,
first_name,
department_id,
salary,
ROUND(AVG(salary) OVER (PARTITION BY department_id), 2) AS dept_avg,
salary - AVG(salary) OVER (PARTITION BY department_id) AS diff_from_avg
FROM employees
ORDER BY department_id, salary DESC;
예방 방법
1. SELECT 절과 GROUP BY 절의 컬럼 일치 규칙을 습관화하기
쿼리를 작성할 때 “SELECT 절에 있는 모든 비집계 컬럼은 반드시 GROUP BY 절에 있어야 한다”는 원칙을 항상 머릿속에 새겨두어야 합니다. 복잡한 쿼리를 작성할 경우 SELECT 절을 먼저 완성한 뒤, GROUP BY 절을 작성할 때 SELECT의 비집계 컬럼을 하나씩 복사해 넣는 습관을 들이면 실수를 크게 줄일 수 있습니다. 또한 쿼리 리뷰 체크리스트에 이 항목을 반드시 포함시켜 팀 전체가 동일한 기준으로 코드를 검토하도록 문화를 정착시키는 것이 좋습니다.
2. SQL 개발 도구의 문법 검사 기능 적극 활용하기
SQL Developer, Toad, DBeaver 등 주요 SQL 개발 도구는 쿼리 실행 전에 문법 오류를 미리 감지해주는 기능을 제공합니다. 이러한 도구의 Lint 기능이나 Explain Plan 기능을 실행 전에 습관적으로 사용하면 ORA-00937을 포함한 다양한 문법 에러를 사전에 잡아낼 수 있습니다. 특히 운영 환경에 쿼리를 반영하기 전에 반드시 개발 또는 테스트 환경에서 먼저 실행하여 검증하는 프로세스를 팀 표준으로 만들어야 합니다.
관련 에러
- ORA-00979:
not a GROUP BY expression— GROUP BY 절에 명시되지 않은 컬럼을 SELECT나 HAVING에서 사용할 때 발생하며, ORA-00937과 밀접하게 연관된 에러입니다. - ORA-00934:
group function is not allowed here— WHERE 절이나 GROUP BY 절 내부에 집계 함수를 직접 사용할 때 발생합니다. 집계 결과를 필터링할 때는 WHERE 대신 HAVING 절을 사용해야 합니다. - ORA-00935:
group function is nested too deeply— 집계 함수의 중첩 깊이가 Oracle이 허용하는 수준을 초과할 때 발생하며, 서브쿼리로 분리하여 해결해야 합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.