SUM()함수에서 NULL값의 처리

 

 

컬럼값이 NULL인 경우 사칙연산을 할 경우 결과값은 모두 NULL이 되게 된다. 이런 결과로,

SUM()함수에서 NULL값의 공포로 인해 우리가 함부로 NVL()함수를 사용하면 비효휼이 발생한다.

 

예를 들어 아래의 경우를 살펴보자.

 

 

SUM(NVL(COL1,0))

 

 

여기서 COL1 컬럼은 SUM()함수에 의하여 연산이 된다. 연산중 NULL값이 있어 전체 결과가 NULL값이 될까 두려워 이렇게 사용했다면 이것은 잘못된 생각이다.

SUM()함수에서 단일 컬럼이 연산이 될 때에는 NULL값은 연산의 대상에서 제외된다. NULL값이 연산을 하지 않았으므로 결과는 절대 NULL값이 되지 않는다. 위 처럼 NVL()함수를 사용하여 NULL값을 가진 경우 '0'으로 바꾸어도 결과는 동일하다. 그러니 SUM()함수 내에 NVL()를 쓰는 것은 불필요한 연산만 증가시키는 것이다.

'0'을 더하는 것도 연산이기 때문이다. 예를 들어 SUM()함수를 이용할 Row가 10만이고 그중 NULL값을 가진 경우가 9만이라고 한다면 불필요한 연산을 9만번이나 더 수행하는 것이 된다.

 

사실 이와 같은 잘못을 저지르는 이유는 NULL값의 연산에 대한 무지보다는 최종으로 추출되는 결과가 NULL값인 겨우에 화면에 공백이 추출되어 보이므로 이를 '0'으로 채우고 싶어서 그렇게 한 경우일 것이다.

그렇다면 이런 경우는 아래와 같이 하여야 한다.

 

 

NVL(SUM(COL1),0)

 

 

바로 위 문장은 앞선 위의 경우와 큰 차이가 없어 보이지만 처리할 일의 양에는 큰 차이가 난다.

조금전에 가정했듯이 Row 10만 건이 있다가 했을 때 전체 값이 NULL인 경우에 앞선 예는 10만 번이나 '0'을 더하는 연산을 하여 '0'을 출력하지만 바로 위의 예는 한번도 연산을 하지 않고 '0'을 출력하게 된다.

 

 

 

이번에는 두 컬럼의 연산이 있는 경우를 살펴보도록 하겠다.

예를 들어 아래와 같이 데이터가 들어 있다고 했을 경우 어떤 결과가 나오는지 확인해 보자.

ROW

COL1

COL2

1

NULL

NULL

2

1

NULL

3

1

1

 

 

* 실행과 결과

SELECT SUM(COL1), SUM(COL1+NULL), SUM(COL1+COL2) FROM 테이블명

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

2 NULL 2

 

위 결과를 보면 SUM(COL1)은 맨 처음 설명했던 대로 결과가 나와 문제가 없다.

그런데 SUM(COL1+COL2)은 "3"이 나올 줄 알았는데 "2"만 나왔다.

SUM 함수가 제공해주는 편의는 어떻게 보면 제공 해 주다가 만 듯한 결과를 보인다.

이 함수가 동일한 컬럼 내의 NULL연산은 처리해 주지만 컬럼별 연산은 처리를 못한다. 다시 말해, 1ROW와 2ROW에는 각 컬럼에 NULL을 포함하고 있기 때문에 NULL처리되고, 실질적으로 3ROW만 정상적으로 처리하게 된다.

따라서, SUM안에서 컬럼별 연산을 할 때에는 NULL을 유발할 수 있는 것들을 반드시 제거해야 한다.

 

이런 경우는 아래와 같이 처리하면 되겠다.

 

NVL(SUM(COL1),0)+ NVL(SUM(COL2),0)

 

[오라클] SQL - SUM()함수에서 NULL값의 처리
출처 : 네이버 블로그

 

 

select * from s_sale_promotion a, s_sale_promotion_emp b
where a.row_id = b.promotion_id
and   a.type = '140'
and   a.sub_type = '010'

'SQL 관련' 카테고리의 다른 글

날짜 관련 SQL  (0) 2016.07.14
부서별 건수  (0) 2015.03.10
집계테이블은 서브 쿼리를 사용하지 않아도 된다.  (0) 2015.02.28
계층형 쿼리 ( START WITH ... CONNECT BY )  (0) 2014.09.29
유용한 쿼리 #1  (0) 2014.09.29
Posted by 달콤한부자
,

* Forms 화면 구성

 

1.객체 관리자 (창) (Object Navigator)

- 개발에 관련된 모든 개체들을 관리할 수 있는 객체 관리창

 

2. 속성 팔레트 (창) (Properties) 

- 개체들은 자신만의 속성을 가지고 있는데 각각의 모듈별로 속성을 수정하거나 설정값을 변경하고자

  사용한다.

- 개체 선택시 해당 속성 설정 값이 자동으로 변경됨

 

3. 캔버스 (레이아웃 편집기)

 - 오브젝트 네비게이터 존재하는 Item들이 화면에서 어떤 위치에 어떻게 나타날지를 디자인 하는곳

 

4. PL/SQL 편집기 

- 트리거나 프로그램 단위(UNIT)을 생성할 때 코딩 작업을 위해 나타나는 창

 

 

 

 

* Forms 기본적인 개체

1.Form

- *.fmb, *.fmx 저장되는 모듈을 말하며

 

2. 속성 팔레트 (창) (Properties)

- 개체들은 자신만의 속성을 가지고 있는데 각각의 모듈별로 속성을 수정하거나 설정값을 변경하고자

사용한다.

- 개체 선택시 해당 속성 설정 값이 자동으로 변경됨

3. 캔버스 (레이아웃 편집기)

- 오브젝트 네비게이터 존재하는 Item들이 화면에서 어떤 위치에 어떻게 나타날지를 디자인 하는곳

4. PL/SQL 편집기

- 트리거나 프로그램 단위(UNIT)을 생성할 때 코딩 작업을 위해 나타나는 창

Posted by 달콤한부자
,

PL/SQL오류의 종류

PL/SQL 2014. 11. 25. 19:10

PL/SQL오류의 종류

예 외 설 명 처 리
미리 정의된 오라클 서버 오류(Predefined Oracle Server) PL/SQL에서 자주 발생하는 약20개의 오류 선언할 필요도 없고, 발생시에 예외 절로 자동 트랩(Trap) 된다.
미리 정의되지 않은 오라클 서버 오류 (Non-Predefined Oracle Server) 미리 정의된 오라클 서버 오류를 제외한 모든 오류 선언부에서 선언해야 하고 발생시 자동 트랩된다.
사용자 정의 오류 (User-Defined) 개발자가 정한 조건에 만족하지 않을경우 발생하는 오류 선언부에서 선언하고 실행부에서 RAISE문을 사용하여 발생시켜야 한다

-  미리 정의된 오라클 서버 오류 (Predefined Oracle Server)

- NO_DATA_FOUND : SELECT문이 아무런 데이터 행을 반환하지 못할 때

- DUP_VAL_ON_INDEX : UNIQUE 제약을 갖는 컬럼에 중복되는 데이터가 INSERT 될 때

- ZERO_DIVIDE : 0으로 나눌 때

- INVALID_CURSOR : 잘못된 커서 연산예

 

 

예시)  WHEN   DUP_VAL_ON_INDEX   THEN
   
          SHOW_MESSAGE('데이터가 존재 합니다.');
          SHOW_MESSAGE('DUP_VAL_ON_INDEX 에러 발생');

      WHEN   TOO_MANY_ROWS   THEN 

        DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS에러 발생');

      WHEN   NO_DATA_FOUND   THEN 

        DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND에러 발생');

      WHEN OTHERS THEN

        DBMS_OUTPUT.PUT_LINE('기타 에러 발생');


 

'PL/SQL' 카테고리의 다른 글

FOR...LOOP문  (0) 2014.10.21
LOOP 문  (0) 2014.10.19
IF문  (0) 2014.10.19
Posted by 달콤한부자
,