Oracle
[days05] 집계함수
다연
2020. 11. 4. 20:34
반응형
집계함수는 지가 알아서 null을 빼고 계산한다.
ORA-00937: not a single-group group function
이거 오류메시지 꼭 알고있자 (집계함수는 일반 컬럼과 같이 못쓴다는 의미)
1. count()
- select한 행의 개수 반환
- count (컬럼명)
ex) emp 테이블에 사원수를 파악
select count(*) --null을 포함한 모든 행의 수
,count(empno)
,count(ename)
,count(comm) --4 (나머지8개는 null)
from emp;
2. avg()
select sum(sal)/count(sal), avg(sal)
from emp;
sum()/count() == avg()인 걸 보니 avg()의 내부구조가 sum()/count()와 같구나를 알 수 있다.
만일
select avg(comm) --550
from emp;
아래 코딩을 출력할때 comm이 null인 사람이 있으면 자기가 알아서 그 사람 빼고 계산한다.
문제) 가장 급여를 많이 받는 사원의 부서번호, 이름, 급여 정보 출력
select deptno, ename, sal
from emp
where sal = (select max(sal) from emp);
where문 안에 있는 쿼리는'서브쿼리'로, max는 바로 where에 못쓰기 때문에 본문처럼 사용해야 한다.
3. Top N - rownum
ex 1) 탑5가져오기
select rownum, deptno,ename, sal
from (
select *
from emp
order by sal desc
)
where rownum<=5; --탑5가져오기
--where rownum<=3 and rownum<=5; --사이 범위값은 안된다 (기억해두기)
ex 2) 총 사원수 출력 + 10번/20/30/40 각 부서의 사원수
select
count(decode(deptno, 10, 'O')) A --10번 부서는 O, 나머지는 null 들어감
,count(decode(deptno, 20, 'O'))B --나머지도 마찬가지
,count(decode(deptno, 30, 'O'))C
,count(decode(deptno, 40, 'O'))D
from emp;
ex 2-2) 인사테이블 남녀 찾기
select
count(decode(mod(substr(ssn,8,1),2),1, 'O'))
,count(decode(mod(substr(ssn,8,1),2),0, 'O'))
from insa;
ex 3) 각 부서별 사원수 구하기 - group by
select deptno
,count(*)
,sum(sal)
,trunc(avg(sal))
from emp
group by deptno
order by deptno desc;
ex 3-2)
select o.deptno, o.ename, o.sal --좋은 코딩은 절대 아님
,(select sum(sal) from emp)총급여액
,trunc((select avg(sal) from emp))전체평균급여액
,(select sum(sal) from emp i where i.deptno = o.deptno)부서별급여합--emp (테이블명)에 alias i
--얘를 상관서브쿼리 라고 한다. 밖의 쿼리와 관계가 있기 때문에
,trunc((select avg(sal) from emp i where i.deptno = o.deptno))부서별평균급여
from emp o; --alias o
emp i와 emp o는 다르다.
안에있는 쿼리를 '상관서브쿼리'라고 한다. (밖의 쿼리와 관계가 있기 때문)
반응형