SUM 과 같은 그룹함수에서 NULL 을 어떻게 처리하는지 확인해보겠습니다.
테스트테이블 tb_nullnotnull 명세는 상기와 같습니다.
- 로우1. CA, CB 컬럼 두 값 모두 null
- 로우2. CA 컬럼만 null
- 로우3. CB 컬럼만 null
- 로우4. CA, CB 컬럼 두 값 모두 not null, 둘 다 값이 할당되어 있습니다.
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;