개발자 미니민의 개발스터디

[Oracle] 오라클 - COUNT() OVER() / SUM() OVER()

by mini_min
[Oracle]
오라클 - COUNT() OVER() / SUM() OVER() 종류

✔️ 분석 함수 종류

: COUNT() OVER(), SUM() OVER(), AVG() OVER(), MAX() OVER(), MIN() OVER() 함수

 

1) COUNT() OVER() 함수

-- 부서별 인원 수를 누적시킨다. (앞 부서별 인원수에 더해서 계속 출력)

 SELECT name, dept, sal, COUNT(*) OVER(ORDER BY dept) cnt
	FROM emp;

 

 

 

⭐ 만약, '사원번호' 처럼 기본키가 COUNT() OVER(ORDER BY empNo) 에서 ORDER BY 에 오면, empNo 가 모두 다르기 때문에 누적이 아닌, 1,2,3,... 이렇게 ROWNUM 처럼 카운트 된다.

SELECT name, dept, sal, COUNT(*) OVER(ORDER BY empNo) cnt
   	 FROM emp;  
--emp 번호가 모두 다르기 대문에 1,2,3... rownum 만든 꼴과 같다.

 

 

 

⭐ PARTITION BY 컬럼 : 컬럼 그룹으로 나누어 행 수 반환

SELECT name, sal, dept, COUNT(*) OVER(PARTITION BY dept) cnt FROM emp;
			--COUNT(*) OVER(PARTITION BY 컬럼) :컬럼그룹으로 나누어 행 수 반환

 

2) SUM() OVER() 함수

SELECT name, dept, sal, SUM(sal) OVER() FROM emp; 
--전체 누계/합계 나옴

SELECT name, dept, sal, SUM(sal) OVER(ORDER BY dept) FROM emp; 
-- 부서별로 누계를 구해서 누적

SELECT name, dept, sal, SUM(sal) OVER(ORDER BY empNo) FROM emp; 
--사원번호별로 개개인꺼 누적함
	
SELECT name, dept, sal, SUM(sal) OVER(PARTITION BY dept) FROM emp; 
--오더바이가 없으니 누계는 안구하고 부서별로 합계만 구함
	
SELECT name, dept, sal, SUM(sal) OVER(PARTITION BY dept ORDER BY empNo) FROM emp; 
--부서별로 누계를 구하고 누적. 부서별 누적
	
SELECT name, dept, pos, sal, SUM(sal) OVER(PARTITION BY dept ORDER BY pos) FROM emp; 
--부서별로 누계. 직위별로~
💡 결과값
1) 전체 합계만 나옴 . = 139315200
2) 부서별 합계 누적 (ORDER BY) = 29590000 , ... 48980000 ...
3) 사원번호별 개개인꺼 누적 (ORDER BY) = 4610000, ... 6130000 ...
4) 누적X 부서별 합계만 구해짐 
5) 부서별로 합계 개개인꺼 누적 (파티션/ORDER BY)
6) 부서별로 합계 직위로 누적 = 6715000, 6715000, ... 11715000, 11715000 ...

 

 

🔒 문제

-- 부서별 인원수와 백분율 구하기

    SELECT dept, DECODE(MOD(SUBSTR(rrn,8,1),2),1,'남자','여자') 성별,
            COUNT(*) 인원수,
            ROUND(COUNT(*) / SUM(COUNT(*)) OVER(PARTITION BY dept) *100) 백분율
            
    FROM emp
    GROUP BY dept, MOD(SUBSTR(rrn,8,1),2)
    ORDER BY dept;

 

   SELECT dept, DECODE(MOD(SUBSTR(rrn,8,1),2),1,'남자','여자') 성별,
            COUNT(*) 인원수,
            SUM(COUNT(*)) OVER(PARTITION BY dept) 부서인원
            
    FROM emp
    GROUP BY dept, MOD(SUBSTR(rrn,8,1),2)
    ORDER BY dept;

 

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기