합계를 구하는 함수 ^^;
요지는 각 레코드별 합계를 구하되 한편으로 총 누계를 한꺼번에 구하는 방법
방법이야 조인이든, 합계 변수를 둬서 프로그램 하든, 합계 쿼리만 한번 더 돌리든...여러가지지만 그중 하나..
예제를 보는게 나을 듯 ㅎㅎ
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 |