CASE문 활용(고급 SQL 활용) - SQL전문가 가이드 p.674~p.675
개발 및 관리/Oracle 9i, 10g, 11g, 12c, 19c 2012. 10. 26. 10:56목적: '월별납입방법별집계' 테이블을 읽어 월요금납부실적 테이블을 가공하려 한다.
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 고객번호, 납입월
;
'개발 및 관리 > Oracle 9i, 10g, 11g, 12c, 19c' 카테고리의 다른 글
페이징 처리(고급 SQL 활용) - SQL전문가 가이드 p.683~p.684 (0) | 2012.10.26 |
---|---|
Union All을 활용한 M:M 관계의 조인(고급 SQL 활용) - SQL전문가 가이드 p.677~p.680 (0) | 2012.10.26 |
Between 조인 - SQL전문가 가이드 p.664 (0) | 2012.10.25 |
부등호 조인 - SQL전문가 가이드 p.659 (0) | 2012.10.25 |
두 개 이상의 값을 리턴하고 싶을 때 - SQL전문가 가이드 p.653~p.654 (0) | 2012.10.25 |