ORA-00934: 그룹 함수는 허가되지 않습니다 (ORA-00934: group function is not allowed here)

ORA-00934: 그룹 함수는 허가되지 않습니다 (ORA-00934: group function is not allowed here) 오류에 대해 안내해드리겠습니다. 해당 오류의 핵심은, 역시 그룹 함수의 이해에서 시작합니다. 그룹 함수와 그 조건에 대한 부분을 중점으로 살펴보며, 어떠한 상황에서 그룹 함수가 허가가 되지 않는지 알아보는 시간을 가져봅시다.

그룹 함수의 종류

오라클에서 그룹 함수는 Group By 절을 통해 지정한 컬럼그룹의 합계, 최솟값, 최댓값, 평균, 개수를 조회하는 역할을 수행합니다. Group by를 생략하면 모든 행에 대해 그룹을 지정합니다.

  • SUM : 그룹의 합계를 조회합니다.
  • MIN : 그룹에서 최솟값을 조회합니다.
  • MAX : 그룹에서 최댓값을 조회합니다.
  • AVG : 그룹의 평균을 조회합니다.
  • COUNT : 그룹의 레코드 개수를 조회합니다.

COUNT 함수는 매개변수의 형태에 따라 반환 값을 달리하기에 부가 설명을 하겠습니다.

  • COUNT(*)은 NULL을 포함한 모든 레코드 개수를 구합니다.
  • COUNT(column)은 NULL을 제외한 column의 개수를 구합니다.
  • COUNT(DISTINCT column)은 DISTINCT절을 통해 중복을 제외한 column 개수를 알 수 있습니다.

예를 들면 100, 100, 200, NULL 4개의 값을 가지고 있는 테이블을 COUNT 함수로 조회하면 다음과 같습니다.

WITH TA
          AS (SELECT 100 AS COL FROM DUAL
              UNION ALL
              SELECT 100 FROM DUAL
              UNION ALL
              SELECT 200 FROM DUAL
              UNION ALL
              SELECT NULL FROM DUAL)
     SELECT COUNT (*), COUNT (col), COUNT (DISTINCT col)
       FROM TA;

  COUNT(*) COUNT(COL) COUNT(DISTINCTCOL)

---------- ---------- ------------------

         4          3                  2

=> 레코드의 총 개수는 4이며, NULL을 제외하면 3개(100, 100, 200)이고, 중복을 제외하면 2개(100, 200)입니다.

그룹 함수 GROUP BY 절

GORUP BY 절에서 모든 레코드에 대한 그룹은 GROUP BY 절을 생략할 수 있으며 그룹함수에 관한 조건은 HAVING 절을 이용합니다.

전체 레코드 그룹 함수

EMP 테이블의 전체 레코드에 대하여 SAL의 합계는 다음과 같습니다.

SELECT SUM (SAL) FROM EMP;

  SUM(SAL)

----------

     29025

그룹별 함수 지정

EMP 테이블에서 각 JOB 별 SAL의 합계는 다음과 같습니다.

SELECT JOB, SUM (SAL) FROM EMP GROUP BY JOB;

JOB         SUM(SAL)

--------- ----------

SALESMAN        5600

CLERK           4150

PRESIDENT       5000

MANAGER         8275

ANALYST         6000

그룹별 함수 조건(HAVING)

EMP 테이블에서 JOB 별 SAL의 합계가 5,000이 넘는 레코드는 다음과 같이 HAVING 절을 사용하여야 합니다.

SELECT JOB, SUM (SAL)
         FROM EMP
     GROUP BY JOB
       HAVING SUM (SAL) > 5000;

JOB         SUM(SAL)
--------- ----------
SALESMAN        5600
MANAGER         8275
ANALYST         6000

ORA-00934: 그룹 함수는 허가되지 않습니다 원인과 해결

그런데 그룹함수에 대해 HAVING이 아니라 WHERE로 사용하시는 경우 상기의 오류가 발생할 수 있습니다. 그룹 함수의 조건은 WHERE가 아니라 HAVING으로 하셔야 합니다.

SELECT JOB, SUM (SAL)
         FROM EMP
        WHERE SUM (SAL) > 5000
     GROUP BY JOB;

3행에 오류:
ORA-00934: 그룹 함수는 허가되지 않습니다

아래는 Where절을 Having절로 변경하여 처리한 예시입니다.

SELECT JOB, SUM (SAL)
    FROM EMP
GROUP BY JOB
  HAVING SUM (SAL) >= 5000;

JOB                  SUM(SAL)
------------------ ----------
SALESMAN                 5600
PRESIDENT                5000
MANAGER                  8275
ANALYST                  6000

다음과 같이 그룹 절 내에 그룹함수를 열거하는 경우에도 'ORA-00934: 그룹 함수는 허가되지 않습니다' 오류가 발생할 수 있답니다. 😭 'GROUP BY'에는 그룹함수를 사용할 수 없습니다. (불필요해요!)

SELECT JOB, SUM (SAL)
    FROM EMP
GROUP BY JOB, SUM (SAL);

ERROR at line 3:
ORA-00934: group function is not allowed here

댓글