[ORACLE] NVL(SUM) 을 해야 할까? SUM(NVL) 을 해야 할까? 그룹함수의 NULL(NULLS) 처리 , group function null(nulls) handling [오라클]

NVL(SUM) 을 해야 할까? SUM(NVL) 을 해야 할까?

SUM 과 같은 그룹함수에서 NULL 을 어떻게 처리하는지 확인해보겠습니다.

테스트테이블 tb_nullnotnull 명세는 상기와 같습니다.

  • 로우1. CA, CB 컬럼 두 값 모두 null
  • 로우2. CA 컬럼만 null
  • 로우3. CB 컬럼만 null
  • 로우4. CA, CB 컬럼 두 값 모두 not null, 둘 다 값이 할당되어 있습니다.
그룹함수의 NULL(NULLS) 처리

CA, CB 컬럼이 null 인 경우 0으로 고려하여 결과가 0, 10, 20, 70 이길 바란다면 해당 값이 나온 결과는 예시에서 3가지가 있습니다.

  • SUM (NVL (CA, 0) + NVL (CB, 0)) C4
  • SUM (NVL (CA, 0)) + SUM (NVL (CB, 0)) D6
  • NVL (SUM (CA), 0) + NVL (SUM (CB), 0) D7

여기서 말씀드릴 수 있는 것은 SUM (NVL (CA, 0)) + SUM (NVL (CB, 0)) D6보다 NVL (SUM (CA), 0) + NVL (SUM (CB), 0) D7가 효율적이라는 것입니다.

전자의 경우 모든 컬럼을 0 처리하여 진행하는데 반해, 후자는 SUM을 먼저 진행(NULL 제외) 합니다. 그룹함수가 NULL을 제외하는 것을 이용하는 것이랍니다. 굳이 0으로 처리할 필요가 없기 때문입니다.

참고로 SUM (NVL (CA, 0) + NVL (CB, 0)) C4, NVL (SUM (CA), 0) + NVL (SUM (CB), 0) D7 에서 후자를 택하는 것을 권장합니다.

  SELECT RN,
         (SELECT CA
            FROM TB_NULLNOTNULL
           WHERE RN = TA.RN)
            CA,
         (SELECT CB
            FROM TB_NULLNOTNULL
           WHERE RN = TA.RN)
            CB,
         SUM (CA + CB) C1,
         SUM (CA + NVL (CB, 0)) C2,
         SUM (NVL (CA, 0) + CB) C3,
         SUM (NVL (CA, 0) + NVL (CB, 0)) C4,
         SUM (CA) + SUM (CB) D1,
         SUM (CA) + SUM (NVL (CB, 0)) D2,
         SUM (CA) + NVL (SUM (CB), 0) D3,
         SUM (NVL (CA, 0)) + SUM (CB) D4,
         NVL (SUM (CA), 0) + SUM (CB) D5,
         SUM (NVL (CA, 0)) + SUM (NVL (CB, 0)) D6,
         NVL (SUM (CA), 0) + NVL (SUM (CB), 0) D7
    FROM TB_NULLNOTNULL TA
GROUP BY RN
ORDER BY RN;

댓글