1. 쿼리

SELECT  Y.계정명,
              SUM(DECODE(X.공정, '원사',금액)) 원사,
              SUM(DECODE(X.공정, '제직',금액)) 제직,
              SUM(DECODE(X.공정, '기모',금액)) 기모,
              SUM(DECODE(X.공정, '염색',금액)) 염색,
              SUM(DECODE(X.공정, '가공',금액)) 가공
  FROM  (
                    SELECT SUBSTR(계정과목,1,2) 항목, 공정, SUM(금액) 금액
                       FROM 전표테이블
                    WHERE 사업장 = '구미공장'
                         AND 전표일자 LIKE :작업월 || '%'
                         AND 계정과목 BETWEEN '1234' AND '5432'
              GROUP BY SUBSTR(계정과목,1,2), 공정
             ) X, 계정테이블 Y
WHERE Y.계정과목 BETWEEN '1200' AND '6500'
     AND Y.항목분류 = '1'
     AND X.항목(+) = SUBSTR(Y.계정과목,1,2)
GROUP BY Y.계정명 ;

2. 주석

위의 SQL은 살펴보면 먼저 데이터를 취합할 전표테이블에서 사업장과 작업월,

그리고 집계할 계정을 조건으로 하여 추출한 집합을 우리가 원하는 단위(여기서는 계정과목 2자리로 가정)로 GROUP BY한다.

그러나 이 집합은 데이터 발생 상황에 따라 값이 존재하니 않는 계정과목이 생길 수가 있다.

그래서 위의 예제에서는 계정 테이블에서 출력한 로우 단위인 계정들만 추출하여

(여기서는 항목분류가 '1'인 것으로 가정) GROUP BY한 집합을 OUTER JOIN을 하였다.