COUNT() OVER() 함수

-- COUNT() OVER() 함수
SELECT name, dept, SAL,
    COUNT(*) OVER( ORDER BY dept) cnt
FROM emp;
-- 부서별 인원수를 누적하여 앞 부서 인원수와 누적해서 출력
-- 동일 부서는 동일 인원

동일부서에는 동일한 인원의 합계가 출력된다. 개발부에는 14명이 존재하고 기획부에는 (21-14) 7명이 존재함.

SELECT name, dept, SAL,
    COUNT(*) OVER( ORDER BY sal) cnt
FROM emp;
-- sal 오름차순으로 정렬하여 같은 sal이면 출력되는 COUNT 값은 같은 인원수를 가짐.

SELECT name, dept, SAL,
    COUNT(*) OVER( ORDER BY sal DESC) cnt
FROM emp;
-- sal 내림차순으로 정렬하여 같은 sal이면 출력되는 COUNT 값은 같은 인원수를 가짐.

첫 번째 쿼리의 결과
두 번째 쿼리의 결과

COUNT는 누적되는 것이고 같은 sal을 가지고 있으면 COUNT(같은 sal의 수를 출력하되 계속 누적됨) 위에 보는 것 처럼 11이 두명에게서 보인다.

SELECT name, dept, SAL,
    COUNT(*) OVER() cnt
FROM emp; -- OVER에 아무것도 기술하지 않으면 전체

SELECT name, dept, SAL,
    COUNT(*) OVER( PARTITION BY dept) cnt
FROM emp; -- 그룹의 인원수를 구하고 이전 그룹은 누적하지 않음


SELECT name, dept, SAL,
    COUNT(*) OVER( PARTITION BY dept) cnt1,
    COUNT(*) OVER( PARTITION BY dept ORDER BY pos) cnt2
FROM emp;

SELECT name, dept, SAL,
    COUNT(*) OVER( PARTITION BY dept) cnt1,
    COUNT(*) OVER( PARTITION BY dept ORDER BY empNo) cnt2
FROM emp;

첫 번째 쿼리의 결과

COUNT() OVER( PARTITION BY ~) 그룹별로 해당하는 값만 출력하고 누적되지 않는다.

두 번째 쿼리의 결과

COUNT() OVER( PARTITION BY ~ ORDER BY) 같은 부서를 가지고 있으면 CNT1에 같은 값을 출력한다. CNT2에는 직위별로 정렬하여 세고 그 값은 동일 부서안에서만 누적된다.

세 번째 쿼리의 결과

개발부서의 인원수를 CNT1에서는 출력하고 CNT2에서는 empNo를 부서별로 누적해서 출력해준다.

SELECT name, dept, SAL,
    COUNT(*) OVER( ORDER BY empNo) cnt
FROM emp
WHERE dept = '개발부';
-- 개발부서만 뽑아서 empNo 오름차순으로 누적하며 출력

SELECT name, dept, SAL,
    COUNT(*) OVER( ORDER BY sal) cnt
FROM emp
WHERE dept = '개발부';
-- 개발부서만 뽑아서 sal 오름차순으로 누적하며 출력

첫 번째 쿼리 결과
두 번째 쿼리 결과

 

+ Recent posts