다연이네

[days07] SQL - RANK, ROLL UP 본문

Oracle

[days07] SQL - RANK, ROLL UP

 다연  2020. 11. 6. 18:55
반응형

여기 두 코딩은 같은 의미이다.

select deptno, count(*)
from emp
group by deptno
order by deptno;


select distinct deptno, count(*) over(partition by deptno)
from emp
order by deptno; 

1. 여러 테이블 조인

emp, dept, salgrade 테이블에서 deptno, dname, ename, sal,  grade 컬럼 출력 

--1
select e.deptno, dname, ename, sal, grade
from emp e , dept d, salgrade s
where e.deptno = d.deptno and e.sal between s.losal and s.hisal;

--2
select e.deptno, dname, ename, sal, grade
from emp e join dept d on e.deptno = d.deptno  --이퀄조인
        join salgrade s on e.sal between s.losal and s.hisal; --논이퀄조인

2.  emp 테이블의 각 부서별 최고급여액 받는 사원 정보 출력

   1) 상관서브쿼리 사용

   2) group by 사용

--1)
select deptno, ename, sal 
from emp o
where o.sal = (select max(sal) from emp i where i.deptno = o.deptno ) 
order by deptno;

--2)
select deptno, max(sal) --대신 group by 때문에 누군지는 확인 불가
from emp 
group by deptno
order by deptno;

 

 

RANK() OVER

- 등수를 매기는 함수로, 그룹 내에서 위치를 계산하여 반환한다.
- 해당 값에 대한 우선순위를 결정하며(중복 순위 계산함) 반환되는 데이터타입은 NUMBER이다.

select *
from(
select deptno, ename, sal
        ,rank() over(ORDER by sal desc) 급여순서
        ,rank() over(partition by deptno order by sal desc) "부서별 급여 순서"
from emp
order by deptno
)
where 급여순서<=5;

rank()over()   ,  dense_rank()over()   ,  row_number()over()  차이점

select ename, sal
        ,rank() over(order by sal desc) r --9,9,11
        ,dense_rank() over(order by sal desc) d --9,9,10
        ,row_number() over(order by sal desc) rn --9,10,11
from emp;

 

집계함수를 일반함수와 같이 쓰는 법

select deptno, ename, sal
        ,sum(sal) over(order by deptno ) 누적
        ,sum(sal) over(partition by deptno order by deptno ) 부서별
from emp;

ROLL UP()

        SELECT   컬럼명, 그룹함수(컬럼명)
        FROM     테이블명
        WHERE    조건
        GROUP BY [ROLLUP ¦ CUBE]그룹핑하고자하는 컬럼명,...
        HAVING   그룹조건
        ORDER BY 컬럼명 또는 위치번호

select deptno, count(*)
from emp
group by deptno
union select null, count(*) from emp;

--같은 의미
select deptno, count(*)
from emp
group by rollup(deptno);

select deptno, job, count(*) --부서별>직급별 사원수
from emp
group by deptno, job
union  
select deptno, null as job, count(*) --부서별 사원수
from emp
group by deptno
union all
select null, null as job , count(*) --전체 사원수
from emp
order by deptno; --오더바이는 늘 합쳐진 마지막에


--같은 의미
select deptno, job, count(*)
from emp 
group by rollup(deptno, job);

 

그럼 CUBE()는 뭐야? - 모든 그룹 조합별로 다 출력

select deptno, job, count(*)
from emp 
group by cube(deptno, job); --모든 그룹 조합별로 다 출력

반응형

'Oracle' 카테고리의 다른 글

[days07] level 의사컬럼  (0) 2020.11.06
[days07] 오라클 data type(자료형)  (0) 2020.11.06
[days06] SQL function 이어서  (0) 2020.11.05
[days05] 집계함수  (0) 2020.11.04
[days05] SQL function2  (0) 2020.11.04
Comments