2026년 07월 05일 | DBMS Error 가이드
이 글에서 다루는 내용
42803 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
42803 grouping error 는?
PostgreSQL 에러 코드 42803, grouping error는 GROUP BY 절을 사용하는 쿼리에서 SELECT 목록, HAVING 절, 또는 ORDER BY 절에 포함된 컬럼이 집계 함수로 감싸지지 않았거나 GROUP BY 절에 명시되지 않았을 때 발생합니다. 즉, SQL 표준에서는 GROUP BY로 묶이지 않은 컬럼을 직접 참조하는 것이 허용되지 않으며, PostgreSQL은 이를 엄격하게 검사합니다. 이 에러는 복잡한 집계 쿼리를 작성할 때 자주 마주치는 에러로, 논리적인 SQL 구조를 이해하면 쉽게 해결할 수 있습니다.
주요 발생 원인
- SELECT 절에 GROUP BY에 포함되지 않은 컬럼을 직접 참조하는 경우
가장 흔한 원인입니다. GROUP BY를 사용하면 결과 집합은 그룹화된 키 값의 조합으로 축약됩니다. 이때 그룹화 키로 지정되지 않은 컬럼은 그룹마다 여러 값을 가질 수 있기 때문에, PostgreSQL은 어떤 값을 대표로 출력해야 할지 알 수 없어 에러를 발생시킵니다. 예를 들어, 부서별 평균 급여를 구하면서 개별 직원 이름을 함께 조회하려 할 때 이 에러가 발생합니다.
- HAVING 절에서 집계 함수 없이 일반 컬럼을 필터링하는 경우
HAVING 절은 그룹화 이후의 결과를 필터링하기 위한 절로, WHERE와는 역할이 다릅니다. HAVING 절에서 집계 함수를 사용하지 않고 GROUP BY에 포함되지 않은 컬럼을 직접 조건으로 사용하면 42803 에러가 발생합니다. 이 경우에는 해당 조건을 WHERE 절로 이동시키거나, 집계 함수로 감싸야 합니다.
- 서브쿼리 또는 CTE 내부에서 외부 쿼리의 컬럼을 잘못 참조하는 경우
복잡한 쿼리 구조에서 서브쿼리나 CTE(Common Table Expression) 안에서 집계를 수행할 때, 외부 쿼리의 컬럼이나 별칭을 GROUP BY 없이 SELECT에 포함시키면 동일한 에러가 발생합니다. 특히 여러 테이블을 조인한 후 집계를 적용할 때, 조인 결과의 일부 컬럼이 GROUP BY에서 누락되는 경우가 많습니다.
해결 방법
원인 1 해결: SELECT 절의 컬럼을 GROUP BY에 추가하거나 집계 함수 적용
에러 발생 쿼리:
-- 에러: employee_name이 GROUP BY에 없음
SELECT department_id, employee_name, AVG(salary)
FROM employees
GROUP BY department_id;
해결 방법 1 – GROUP BY에 컬럼 추가:
-- 해결: employee_name을 GROUP BY에 포함
SELECT department_id, employee_name, AVG(salary)
FROM employees
GROUP BY department_id, employee_name;
해결 방법 2 – 집계 함수 사용 (부서별 대표값만 필요한 경우):
-- 해결: 집계 함수로 감싸기
SELECT department_id, MAX(employee_name) AS representative_name, AVG(salary)
FROM employees
GROUP BY department_id;
해결 방법 3 – 서브쿼리 활용 (부서 평균 급여와 직원 목록을 함께 조회):
-- 해결: 서브쿼리로 집계 결과를 별도로 계산 후 조인
SELECT e.employee_name, e.department_id, dept_avg.avg_salary
FROM employees e
JOIN (
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
) dept_avg ON e.department_id = dept_avg.department_id;
원인 2 해결: HAVING 절의 조건을 WHERE 절로 이동하거나 집계 함수 적용
에러 발생 쿼리:
-- 에러: HAVING 절에서 GROUP BY에 없는 컬럼 직접 참조
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING employee_name = 'John';
해결 방법 – WHERE 절로 이동:
-- 해결: 그룹화 전에 필터링은 WHERE 절 사용
SELECT department_id, AVG(salary)
FROM employees
WHERE employee_name = 'John'
GROUP BY department_id;
집계 결과에 대한 HAVING 올바른 사용 예:
-- HAVING은 집계 결과 필터링에 사용
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000000;
원인 3 해결: 서브쿼리 및 CTE에서 누락된 GROUP BY 컬럼 추가
에러 발생 쿼리:
-- 에러: CTE 내부에서 join_date가 GROUP BY에 누락
WITH dept_stats AS (
SELECT department_id, join_date, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id
)
SELECT * FROM dept_stats;
해결 방법:
-- 해결: join_date를 GROUP BY에 포함하거나 집계 함수 적용
WITH dept_stats AS (
SELECT department_id, COUNT(*) AS emp_count, MIN(join_date) AS earliest_join
FROM employees
GROUP BY department_id
)
SELECT * FROM dept_stats;
실무에서 자주 쓰는 DISTINCT ON과 GROUP BY 혼합 패턴:
-- 부서별 최고 연봉 직원 정보 조회 (DISTINCT ON 활용)
SELECT DISTINCT ON (department_id)
department_id,
employee_name,
salary
FROM employees
ORDER BY department_id, salary DESC;
예방 방법
- SELECT 절 작성 시 GROUP BY 동기화 규칙 습관화
쿼리를 작성할 때 SELECT 절에 나열하는 모든 컬럼이 집계 함수 안에 포함되어 있는지, 아니면 GROUP BY 절에 명시되어 있는지를 항상 확인하는 습관을 들이세요. 특히 여러 테이블을 조인한 후 집계를 적용할 때는 SELECT 목록과 GROUP BY 목록을 나란히 놓고 비교하며 작성하면 실수를 줄일 수 있습니다. IDE나 쿼리 툴(DBeaver, DataGrip 등)의 SQL 린팅 기능을 활용하면 실행 전에 이런 오류를 미리 잡아낼 수 있습니다.
- 복잡한 집계 쿼리는 CTE로 단계별로 분리하여 작성
하나의 쿼리에서 여러 단계의 집계를 한꺼번에 처리하려 하면 GROUP BY 누락 실수가 발생하기 쉽습니다. CTE(WITH 절)를 적극 활용하여 집계 단계를 분리하고, 각 CTE가 올바른 GROUP BY를 포함하는지 단계별로 검증하면 에러를 사전에 예방할 수 있습니다. 또한 단계별로 쿼리를 실행해보며 중간 결과를 확인하는 방식은 디버깅 시간도 크게 줄여줍니다.
관련 에러
- 42P10 (invalid_column_reference):
ORDER BY절에서SELECT목록에 없는 컬럼을 참조할 때 발생하며,GROUP BY쿼리에서 함께 나타나는 경우가 있습니다. - 42803과 함께 주의할 표준 SQL 동작: MySQL과 달리 PostgreSQL은
ONLY_FULL_GROUP_BY모드가 기본 동작이므로, MySQL에서 정상 동작하던 쿼리가 PostgreSQL에서 42803 에러를 발생시키는 경우가 많습니다. 마이그레이션 시 반드시 주의가 필요합니다. - 22012 (division_by_zero): 집계 함수와 함께 나누기 연산을 사용할 때 그룹 내 데이터가 없거나 0인 경우 함께 발생할 수 있어 주의가 필요합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.