라일락 꽃이 피는 날

[Oracle] 데이터 분석 함수 3 - 누적 데이터, 비율 본문

프로그래밍/Oracle

[Oracle] 데이터 분석 함수 3 - 누적 데이터, 비율

eunki 2022. 5. 30. 18:19
728x90

데이터 분석 함수

  • sum over : 누적 데이터 출력
  • ratio_to_report : 비율 출력

 

 

 

 

윈도우 기준 윈도우 방식 설명
rows unbounded preceding 맨 첫 번째 행을 가리킵니다.
  unbounded following 맨 마지막 행을 가리킵니다.
  current row 현재 행을 가리킵니다.
range    

rows 는 행을 기준으로 누적치를 구하는 것이고, range 는 범위를 기준으로 누적치를 구하는 것이다.

 

 

 

 

예제 1. 사원 번호, 사원 이름, 월급, 사원 테이블의 토탈 월급을 출력

select empno, ename, sal, sum(sal) over()
    from emp;

sum(sal) over 다음에 괄호 안에다가 아무것도 쓰지 않으면 전체 토탈 월급이 출력된다.

 

 

select empno, ename, sal, sum(sal) over (order by sal rows
                                         between unbounded preceding 
                                         and unbounded following) 토탈
    from emp;

제일 첫 번째 행부터 제일 마지막 번째 행까지 월급들의 토탈 값을 출력

 

 

 

예제 2. 사원 번호, 사원 이름, 월급, 월급에 대한 누적치를 출력

select empno, ename, sal, sum(sal) over(order by sal)
    from emp;

sum(sal) over (order by sal) 까지만 쓰면 14275가 두 번 나온다.

 

 

select empno, ename, sal, sum(sal) over (order by sal range
                                         between unbounded preceding 
                                         and current row) 누적치
    from emp;

sum over 의 기본 옵션이 range between unbounded preceding and current row 으로 되어있다.

 

 

select empno, ename, sal, sum(sal) over (order by sal rows
                                         between unbounded preceding 
                                         and current row) 누적치
    from emp;

제대로 사용하려면 위와 같이 해야 한다.

 

 

 

예제 3. emp2 테이블에서 이름, 입사일, 월급, 월급에 대한 누적치를 출력

create table emp2
as
select *
    from emp
    order by deptno asc;
    
update emp2
    set hiredate = '81/01/05'
    where deptno = 10;

update emp2
    set hiredate = '81/02/17'
    where deptno = 20;
   
update emp2
    set hiredate = '81/03/21'
    where deptno = 30;
    
commit;
select ename, hiredate, sal, sum(sal) over (order by hiredate range
                                            between unbounded preceding
                                            and current row) 누적치
    from emp2;

rows 를 윈도우 기준으로 주었을 때는 무조건 행을 기준으로 월급을 누적하고,

range 를 윈도우 기준으로 주었을 때는 입사일에 대한 범위로 월급을 누적한다.

 

 

 

예제 4. 부서 번호가 20번인 사원들의 사원 번호, 이름, 월급, 월급에 대한 비율을 출력

select empno, ename, sal, ratio_to_report(sal) over () as 비율,
                          sal / sum(sal) over () as  "비교비율"
    from emp
    where deptno = 20;

 

 

 

예제 5. 부서 번호, 사원 이름, 월급, 자신의 월급의 비율을 출력하는데, 부서 번호 별로 각각 월급의 비율을 출력

select deptno, ename, sal
       , ratio_to_report(sal) over (partition by deptno) as 비율
    from emp;
728x90