본문 바로가기

Database&WAS/Oracle

[Oracle] SUM() 함수

합계를 구하는 함수 ^^;
요지는 각 레코드별 합계를 구하되 한편으로 총 누계를 한꺼번에 구하는 방법
방법이야 조인이든, 합계 변수를 둬서 프로그램 하든, 합계 쿼리만 한번 더 돌리든...여러가지지만 그중 하나..

예제를 보는게 나을 듯 ㅎㅎ

SELECT mcode, total, unload, transfer, special,
       SUM (total) OVER (ORDER BY mcode) AS t_weight,
       SUM (unload) OVER (ORDER BY mcode) AS t_unload,
       SUM (transfer) OVER (ORDER BY mcode) AS t_trnasfer,
       SUM (special) OVER (ORDER BY mcode) AS t_sepcial
  FROM (SELECT   a.mcode, SUM (totweight) AS total,
                 SUM (DECODE (b.type, 'I', totweight, 0)) AS unload,
                 SUM (DECODE (b.type, 'T', totweight, 0)) AS transfer,
                 SUM
                    (CASE
                        WHEN NVL (TRIM ( spcode1  || spcode2 || spcode3 ),
                                  'NO' ) NOT IN ('NOT','NO','FALSE')
                           THEN totweight
                        ELSE 0
                     END
                    ) AS special
            FROM masterdata a, subdata b
           WHERE a.key1 = :key1
             AND a.type = 'I'
             AND a.key1 = b.key1
             AND a.sender = b.sender
        GROUP BY a.mcode)

1. SUM (DECODE (b.type, 'I', totweight, 0)) AS unload
sum()으로 합계를 구할 때 특정 조건의 합계만을 구하기 위해 decode()함수 사용

2. WHEN NVL (TRIM ( spcode1  || spcode2 || spcode3 )
decode등으로 조건 처리할때 경우의 수등이 다양하거나 조건이 많을 경우  case 문을 사용하여 심플하게 처리, null 일 경우 제외 하기 위해 nvl() 함수 사용

3. SUM (unload) OVER (ORDER BY mcode) AS t_unload
각 mcode별 합계를 구하는데 총 누계도 구할 경우 사용
총 누계를 구할 경우에도 예를 들어 'customer'  라는 필드 별 총합계를 구할 경우에는
'PARTITION BY 필드' 를 사용
ex) SUM(unload) OVER (PARTITION BY customer ORDER BY mcode)

'Database&WAS > Oracle' 카테고리의 다른 글

[Oracle] COALESCE() 함수  (0) 2011.06.27
[Oracle] NULLIF() 함수  (0) 2011.06.27
HINTs #1 - [Oracle]  (0) 2011.03.16
HINTs #2 - [Oracle]  (0) 2011.03.16
Hint 요약 - [Oracle]  (0) 2011.03.16