윈도우 함수 OVER ( PARTITION BY 절 ORDER BY 절 [ASC|DESC] ROWS | RANGE BETWEEN UNBOUNDED PRECEDING | n PRECEDING | CURRENT ROW AND UNBOUNDED FOLLOWING | n FOLLOWING | CURRENT ROW
아래는 부서별(PARTITION BY deptno)로 이전 ROW(ROWS 1 PRECEDING)의 급여와 현재 ROW의 급여 합계를 출력하는 예제이다
SELECT empno, ename, deptno, sal, SUM(sal) OVER (PARTITION BY deptno ORDER BY empno ROWS 1 PRECEDING ) pre_sum FROM emp; -- PRE_SUM : 이전 ROW와 현재 ROW의 급여 합계가 출력된 것을 확인 할 수 있다. EMPNO ENAME DEPTNO SAL PRE_SUM ------ ------- ---------- ---------- ---------- 7782 CLARK 10 2450 2450 7839 KING 10 5000 7450 7934 MILLER 10 1300 6300 7369 SMITH 20 800 800 7566 JONES 20 2975 3775 7788 SCOTT 20 3000 5975 7876 ADAMS 20 1100 4100 7902 FORD 20 3000 4100 7499 ALLEN 30 1600 1600 7521 WARD 30 1250 2850 7654 MARTIN 30 1250 2500 7698 BLAKE 30 2850 4100 7844 TURNER 30 1500 4350 7900 JAMES 30 950 2450
아래 예제는 첫 번째 ROW부터 마지막 ROW까지의 합과(SAL1), 첫 번째 ROW부터 현재 ROW까지의 합(SAL2) 그리고 현재 ROW부터 마지막 ROW까지의 합(SAL3)을 출력하는 예제이다.
SELECT empno, ename, deptno, sal, SUM(sal) OVER(ORDER BY deptno, empno ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) sal1, SUM(sal) OVER(ORDER BY deptno, empno ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) sal2, SUM(sal) OVER(ORDER BY deptno, empno ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) sal3 FROM emp; -- SAL1 : 첫 번째 ROW부터 마지막 ROW까지의 급여 합계이다. -- SAL2 : 첫 번째 ROW 부터 현재 ROW까지의 급여 합계이다. -- SAL3 : 현재 ROW부터 마지막 ROW까지 급여 합계이다. EMPNO ENAME DEPTNO SAL SAL1 SAL2 SAL3 ------ ------- ---------- ---------- ---------- ---------- ---------- 7782 CLARK 10 2450 29025 2450 29025 7839 KING 10 5000 29025 7450 26575 7934 MILLER 10 1300 29025 8750 21575 7369 SMITH 20 800 29025 9550 20275 7566 JONES 20 2975 29025 12525 19475 7788 SCOTT 20 3000 29025 15525 16500 7876 ADAMS 20 1100 29025 16625 13500 7902 FORD 20 3000 29025 19625 12400 7499 ALLEN 30 1600 29025 21225 9400 7521 WARD 30 1250 29025 22475 7800 7654 MARTIN 30 1250 29025 23725 6550 7698 BLAKE 30 2850 29025 26575 5300 7844 TURNER 30 1500 29025 28075 2450 7900 JAMES 30 950 29025 29025 950
아래는 월별 금액 리스트를 출력하고, 직전 3개월 합계(AMT_PRE3)와 이후 3개월 합계(AMT_FOL3)를 함께 표시하는 예제이다.
아래 예제에서는 7월 데이터가 없기 때문에 직전 3개월 합계(AMT_PRE3) 8월의 경우 6월,5월 두 달치만 누적된 것을 확인 할 수 있다.
WITH test AS ( SELECT '200801' yyyymm, 100 amt FROM dual UNION ALL SELECT '200802', 200 FROM dual UNION ALL SELECT '200803', 300 FROM dual UNION ALL SELECT '200804', 400 FROM dual UNION ALL SELECT '200805', 500 FROM dual UNION ALL SELECT '200806', 600 FROM dual UNION ALL SELECT '200808', 800 FROM dual UNION ALL SELECT '200809', 900 FROM dual UNION ALL SELECT '200810', 100 FROM dual UNION ALL SELECT '200811', 200 FROM dual UNION ALL SELECT '200812', 300 FROM dual ) SELECT yyyymm , amt , SUM(amt) OVER(ORDER BY TO_DATE(yyyymm,'yyyymm') RANGE BETWEEN INTERVAL '3' MONTH PRECEDING AND INTERVAL '1' MONTH PRECEDING) amt_pre3 , SUM(amt) OVER(ORDER BY TO_DATE(yyyymm,'yyyymm') RANGE BETWEEN INTERVAL '1' MONTH FOLLOWING AND INTERVAL '3' MONTH FOLLOWING) amt_fol3 FROM test ; -- AMT_PRE3 : 직전 3개월 합계 -- AMT_FOL3 : 이후 3개월 합계 YYYYMM AMT AMT_PRE3 AMT_FOL3 --------- ---------- ---------- ---------- 200801 100 900 200802 200 100 1200 200803 300 300 1500 200804 400 600 1100 200805 500 900 1400 200806 600 1200 1700 200808 800 1100 1200 200809 900 1400 600 200810 100 1700 500 200811 200 1800 300 200812 300 1200
- 강좌 URL : http://www.gurubee.net/lecture/2674
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.
작성해주신 row 사용예제2에서..
SELECT
empno, ename, deptno, sal,
SUM
(sal) OVER(
ORDER
BY
deptno, empno
ROWS
BETWEEN
UNBOUNDED PRECEDING
AND
UNBOUNDED FOLLOWING) sal1,
SUM
(sal) OVER(
ORDER
BY
deptno, empno
ROWS
BETWEEN
UNBOUNDED PRECEDING
AND
CURRENT
ROW) sal2,
SUM
(sal) OVER(
ORDER
BY
deptno, empno
ROWS
BETWEEN
CURRENT
ROW
AND
UNBOUNDED FOLLOWING) sal3
FROM
emp;
셋다 depno, empno 정렬이 되어있어서 저렇게 출력되었으나
마지막 분석행을 order by empno, deptno으로 했더니 전체 로우가