SQL

그룹 함수(집계 함수)

에어팟맥스 2022. 7. 5. 17:43

------ >> 그룹 함수(집계 함수) << ------

    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