All thing of the world!

Oracle AVG 설명 : 오라클 함수 본문

IT/Oracle DBMS

Oracle AVG 설명 : 오라클 함수

WorldSeeker 2021. 4. 7. 08:51

1. 함수의 목적
    

   Oracle AVG는 parameter로 받은 인자의 평균값을 구해 리턴한다. 집계와 분석용으로 사용가능하다.

2. 샘플을 통한 개념 퀵뷰

SELECT AVG(salary) "Average"
FROM employees;
Average
--------------
6461.83178

3. 사용방법


4. 함수 PARAMETER 설명

[expr]
숫자 타입 혹은 비숫자타입이라도 숫자로 형변환이 가능한 것을 인자로 사용할 수 있다.
본 함수의 리턴값은 [expr]의 데이터타입으로 반환한다.


[DISTINCT]를 지정하면 [analytic_clause]의 [query_partition_clause]만 지정할 수 있고,
[order_by_clause] 및 [windowing_clause]는 허용되지 않는다.

[ALL]
[ALL]은 DISTINCT의 반대다. 기본적으로 [DISTINCT]를 명시하지 않으면, [ALL]이다.

5. 다양한 샘플표현

example 1) distinct를 사용하면 order_by_clause는 허용되지 않는다.

select avg(distinct department_id) over (partition by manager_id 
order by manager_id) from employees;

ORA-30487: ORDER BY를 여기에 사용할 수 없습니다
30487. 00000 -  "ORDER BY not allowed here"
*Cause:    DISTINCT functions and RATIO_TO_REPORT cannot have an ORDER BY
*Action:
5행, 66열에서 오류 발생


example2) DISTINCT를 쓰면 [query_partition_clause]까지는 지정가능하며, 에러없이 수행된다.

select avg(distinct department_id) over (
partition by manager_id) from employees;
AVG(DISTINCTDEPARTMENT_ID)OVER(PARTITIONBYMANAGER_ID)
-----------------------------------------------------
                                                   54
                                                   54
                                                   54
                                                   54
                                                   54
                                                   54
                                                   54
                                                   54
                                                   54
                                                   54
                                                   54


example 2) ALL을 사용한 경우와 안한 경우, 결과는 동일하다.

select avg(
all department_id) from employees; --ALL을 사용한 경우
AVG(ALLDEPARTMENT_ID)
---------------------
           63.2075472


select avg(department_id) from employees; --ALL을 사용하지 않은 경우
AVG(DEPARTMENT_ID)
------------------
        63.2075472


example3) DISTINCT를 사용한 경우와 안한 경우, 결과는 다르다.

select avg(
distinct department_id) from employees; --DISTINCT를 사용한 경우
AVG(DISTINCTDEPARTMENT_ID)
--------------------------
                        60


select avg(department_id) from employees; --DISTINCT를 사용하지 않은 경우
AVG(DEPARTMENT_ID)
------------------
        63.2075472


example 4) 혹시 남자와 여자의 중간인  개념상의 평균인 중년아줌마/중년아저씨를 알아낼 수 있을까? 빅데이터와 AI의 시대니까! 

select avg(x) from (select '남자' x from dual union all select '여자' x from dual);

select avg(x) from (select '남자' x from dual union all select '여자' x from dual)
           *
1행에 오류:
ORA-01722: 수치가 부적합합니다


안타깝지만, 없다!

Comments