그룹 함수(집계 함수)
------ >> 그룹 함수(집계 함수) << ------
1. sum -- 합계
2. avg -- 평균
3. max -- 최대값
4. min -- 최소값
5. count -- select 되어서 나오는 결과물의 행의 개수
6. variance -- 분산
7. stddve -- 표준편차
분산 : 분산의 제곱근이 표준편차 (평균에서 떨어진 정도)
표준편차 : 표준편차의 제곱승이 분산(평균과의 차액)
50 60 40 50 55 45 52 48 평균 50 편차가 적음 -- 안정투자
10 90 20 80 30 70 90 10 평균 50 편차가 큼 -- 투기성투자(위험을 안고서 투자함)
분산과 표준편차는 의사결정 시 도움이 되는 지표이다.
그룹함수와 단일행함수의 차이: 그룹함수는 결과값이 오로지 1개행만 나오는 반면 단일행함수는 결과값이 메모리에 로드되어진 행의 개수만큼 동일한 개수로 나온다.
그룹함수(집계함수)에서는 null이 있으면 무조건 null을 제외한 후 연산을 한다.
그룹함수(집계함수)를 사용하면 1개의 결과값을 가진다.
select 20+57+178+43+null+109
from dual;
-- NULL
select sum(salary*commission_pct)
from employees;
-- 73690
select sum(salary), avg(salary),
max(salary), min(salary),
variance(salary), stddev(salary)
from employees;
-- 691416 6461.831775700934579439252336448598130841 24000 2100 15284813.66954681713983424440134015164874 3909.579730552481921059198878167256201202
select sum(salary*commission_pct), avg(salary*commission_pct)
, max(salary*commission_pct), min(salary*commission_pct), count(salary*commission_pct)
, variance(salary*commission_pct), stddev(salary*commission_pct)
from employees;
-- 73690 2105.428571428571428571428571428571428571
-- 5600 610 35
-- 1354447.60504201680672268907563025210085 1163.807374543578326917875190458887616995
select count(*) AS 모든인원수
, count(department_id) AS "부서번호가NULL이아닌개수"
, count(commission_pct) AS "커미션이NULL이아닌개수"
, count(salary) AS "기본급여가NULL이아닌개수"
from employees;
-- 107 106 35 107
---- **** avg(평균)을 구할 때는 많은 주의를 요한다. **** ----
-- employees 테이블에서 기본급여(salary)의 평균치를 구하라.
select avg(salary), sum(salary)/count(salary), sum(salary), count(salary)
from employees;
-- 6461.831775700934579439252336448598130841
-- employees 테이블에서 수당(salary*commission_pct)의 평균치를 구하라.
[틀린 풀이]
select avg(salary*commission_pct), sum(salary*commission_pct)/count(salary*commission_pct)
, sum(salary*commission_pct), count(salary*commission_pct)
from employees;
-- 2105.428571428571428571428571428571428571 2105.428571428571428571428571428571428571
-- 73690 35
-- avg(salary*commission_pct) 은 salary*commission_pct 의 값이 NULL이 아닌 사원들만의 수당평균치이다.
-- avg( NVL(salary*commission_pct, 0) ) 은 salary*commission_pct 값이 NULL이라면 0으로 처리하기 때문에
-- employees 테이블에 있는 모든 직원들에 대한 커미션의 평균치를 구해주는 것이다.
[맞는 풀이]
select avg( NVL(salary*commission_pct, 0) )
, sum( NVL(salary*commission_pct, 0) )/count( NVL(salary*commission_pct, 0) )
, sum( NVL(salary*commission_pct, 0) )
, sum( salary*commission_pct )
, count( NVL(salary*commission_pct, 0) )
from employees;
-- 688.691588785046728971962616822429906542
-- 688.691588785046728971962616822429906542
-- 73690 73690 107