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
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.
안녕하세요 강좌 잘보고 있습니다~ 질문이 있는데요 keep예제 1, 2에서 결과값이 다른데
keep을 사용하여 예제2처럼 보이게 할 수도 있나요?