KEEP 함수의 사용방법은 아래와 같으며, 예제를 실습하면서 이해해 보겠습니다.
아래는 부서별 최대급여자 급여(MAX_SAL)와 사번(MAX_E), 최소급여자 급여(MIN_SAL)와 사번(MIN_E)을 조회하는 예제입니다.
SELECT deptno , MAX(sal) max_sal , MAX(empno) KEEP(DENSE_RANK LAST ORDER BY sal) max_e , MIN(sal) min_sal , MIN(empno) KEEP(DENSE_RANK FIRST ORDER BY sal) min_e FROM emp GROUP BY deptno ORDER BY deptno ; DEPTNO MAX_SAL MAX_E MIN_SAL MIN_E ------- ---------- ---------- ---------- ---------- 10 5000 7839 1300 7934 20 3000 7902 800 7369 30 2850 7698 950 7900
KEEP을 사용하지 않을경우 아래와 같은 SQL문으로 동일한 결과를 얻을 수 있습니다.
SELECT a.deptno , a.max_s , e1.empno max_e , a.min_s , e2.empno min_e FROM (SELECT deptno , MAX(sal) max_s , MIN(sal) min_s FROM emp GROUP BY deptno ) a , emp e1 , emp e2 WHERE a.deptno = e1.deptno AND a.max_s = e1.sal AND a.deptno = e2.deptno AND a.min_s = e2.sal ORDER BY a.deptno ;
아래는 버전별 정리로 문자열 합치는 예제이다.
SELECT deptno , SUBSTR(XMLAgg(XMLELEMENT(x, ',', empno) ORDER BY empno).Extract('//text()'), 2) "9i" , WM_CONCAT(empno) "10g" , LISTAGG(empno, ',') WITHIN GROUP(ORDER BY empno) "11g" FROM emp GROUP BY deptno ORDER BY deptno DEPTNO 9i 10g 11g ------- ----------------------------- ----------------------------- ------------------------------- 10 7782,7839,7934 7782,7934,7839 7782,7839,7934 20 7369,7566,7788,7876,7902 7369,7876,7788,7902,7566 7369,7566,7788,7876,7902 30 7499,7521,7654,7698,7844,7900 7499,7900,7844,7698,7654,7521 7499,7521,7654,7698,7844,7900
WM_CONCAT은 정렬을 사용 할 수 없으며, 그 외 방법들은 정렬 기능을 사용 한 것을 확인 할 수 있다.
- 강좌 URL : http://www.gurubee.net/lecture/2676
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.