Oracleグループ関数


1.グループ関数


SUM合計
AVG平均値
最大MAX値
MIN最小値
COUNT総数
-하나 이상의 행을 그룹으로 묶어 연산 => 종합, 평균 등 하나의 결과를 구함
-모든 그룹 함수들은 null 값 무시 ( count(*) 제외 )


select  sum(salary),
	avg(salary),
    	max(salary),
        min(salary)
from employee;

count関数

count(*)	 	: null을 포함한 모든 행 개수
count(컬럼명)            : null이 아닌 행의 개수
count(discount 컬럼명)   : 중복되는 값을 제외하는 행의 개수
count(all 컬럼명)        : 중복되는 값을 포함한 행의 개수



ex)

select count(job), 
count(all job) as "all한 직업 수"
from employee;                     // 14 14


select count(commission), 
count(all commission) as "all한 커미션 수", count(*)
from employee;                     // 4 4 14


select count(job), 
count(distinct job) as "중복 제외한 직업 수"
from employee;                     // 14 5

グループ関数と単純な列

select ename, MAX(salary)  // 1:다 => 오류
from EMPLOYEE; 

그룹함수의 결과 값: 1개 
그룹함수를 적용하지 않은 컬럼은 결과 값: 여러 개

=> 매칭이 되지 않음. 무조건 1:1

2.データグループ


group by

- 특정 컬럼을 기준으로 그룹별로 나눔
- group by절 뒤에 별칭 사용 불가
- group by절에 명시하지 않은 컬럼을 select절에 사용하면 오류 발생



1) 소속 부서별로 평균 급여를 부서 번호와 함께 출력
  (부서번호를 기준으로 오름차순 정렬)

select round(avg(salary)) as "평균 급여", dno
from employee
group by dno
order by dno;


2)

select round(avg(salary))  ← 부서번호가 없으면 결과 무의미 
from employee
group by dno;



3) group by절에 명시하지 않은 컬럼을 select절에 사용시 오류

select dno, ename, round(avg(salary)) 
from employee
group by dno, ename;


4) group by절은 부서번호를 기준으로 그룹화한 다음
  해당 부서 번호 그룹 내에서 직업을 기준으로 다시 그룹화
  
select dno, job, count(*), sum(salary),a avg(salary)
from employee
group by dno, job
order by dno, job;

3.グループ化結果の制限


having



-그룹 함수의 결과 중 having절 다음에 지정한 조건에 
 true인 그룹으로 결과 제한
 
- 두 번까지 중첩해 사용가능



ex.

1) 부서별 급여 총액이 3000 이상인 부서의 번호와 부서별 급여 총액 구하기

select dno, max(salary)
from employee
group by dno
having max(salary) >= 3000;



2) 직급별 급여 평군의 최고값 구하기

select dno, max(avg(salary))
from employee
group by dno;

=> 오류 
dno : 4개
max(avg(salary)) : 1개이므로 매칭 불가



해결))

select max(avg(salary))
from employee
group by dno;



2-1) dno도 함께 출력하려면 서브쿼리 사용

select dno, avg(salary)
from employee
group by dno
having avg(salary) = (select MAX(avg(salary))
  					 from employee
					 group by dno);

= 대신 in 사용 가능