반응형

목적: '월별납입방법별집계' 테이블을 읽어 월요금납부실적 테이블을 가공하려 한다.

 

1차 단계 - '월별납입방법별집계' 테이블에서 동일 레코드를 반복 액세스 한다.

 

INSERT INTO 월별요금납부실적

(고객번호, 납입월, 지로, 자동이체, 신용카드, 핸드폰, 인터넷)

SELECT K.고객번호, '201203' 납입월

, A.납입금액 지로

, B.납입금액 자동이체

, C.납입금액 신용카드

, D.납입금액 핸드폰

, E.납입금액 인터넷

 FROM 고객 K

, (SELECT 고객번호, 납입금액

FROM 월별납입방법별집계

WHERE 납입월 = '201203'

AND 납입방법코드 ='A') A

, (SELECT 고객번호, 납입금액

FROM 월별납입방법별집계

WHERE 납입월 = '201203'

AND 납입방법코드 ='B') B

, (SELECT 고객번호, 납입금액

FROM 월별납입방법별집계

WHERE 납입월 = '201203'

AND 납입방법코드 ='C') C

, (SELECT 고객번호, 납입금액

FROM 월별납입방법별집계

WHERE 납입월 = '201203'

AND 납입방법코드 ='D') D

, (SELECT 고객번호, 납입금액

FROM 월별납입방법별집계

WHERE 납입월 = '201203'

AND 납입방법코드 ='E') E

WHERE A.고객번호(+) = K.고객번호

AND B.고객번호(+) = K.고객번호

AND C.고객번호(+) = K.고객번호

AND D.고객번호(+) = K.고객번호

AND E.고객번호(+) = K.고객번호

AND NVL(A.납입금액, 0) + NVL(B.납입금액, 0) + NVL(C.납입금액, 0)

     + NVL(D.납입금액, 0) + NVL(E.납입금액, 0) > 0

;

 

*****

2차 단계 - I/O 효율을 고려하여 One-SQL로 작성한다.

             - One-SQL을 구현하는데 있어서 CASE문이나 DECODE 함수를 활용하는 기법은 IFELSE 같은 분기조건을 포함한 복잡한 처리절차를 단순화 시키기 위해 꼭 필요하다.

             - SQL Server에서는 2005 버전 부터 Pivot 구문을 지원하고, Oracle도 11g부터 지원하기 시작했으로 Pivot을 사용하면 된다.

 

INSERT INTO 월별요금납부실적

 (고객번호, 납입월, 지로, 자동이체, 신용카드, 핸드폰, 인터넷)

SELECT 고객번호, 납입월

, NVL(SUM(CASE WHEN 납입방법코드 = 'A' THEN 납입금액 END), 0) 지로

, NVL(SUM(CASE WHEN 납입방법코드 = 'B' THEN 납입금액 END), 0) 자동이체

, NVL(SUM(CASE WHEN 납입방법코드 = 'C' THEN 납입금액 END), 0) 신용카드

, NVL(SUM(CASE WHEN 납입방법코드 = 'D' THEN 납입금액 END), 0) 핸드폰

, NVL(SUM(CASE WHEN 납입방법코드 = 'E' THEN 납입금액 END), 0) 인터넷

FROM 월별납입방법별집계

WHERE 납입월 = '201203'

GROUP BY 고객번호, 납입월

;

반응형