DATABASE

[오라클] 그룹함수(SUM(), AVG(), COUNT(), MAX(), MIN(), VERIENCE(), STDDEV())

온풀 2022. 3. 11. 23:41
20220223_01_scott.sql / 오라클 7일 차

- 그룹함수

SUM() 합, AVG() 평균, COUNT() 카운트, MAX() 최대값, MIN() 최솟값, VERIENCE() 분산, STDDEV() 표준편차

- 그룹함수의 가장 큰 특징

처리해야 할 데이터들 중 NULL 이 존재한다면(포함되어 있다면) 이 NULL 은 제외한 상태로 연산을 수행한다는 것이다. 즉, 그룹 함수가 작동하는 과정에서 NULL 은 연산의 대상에서 제외된다.

--○ SUM() 합
-- EMP 테이블을 대상으로 전체 사원들의 급여 총합을 조회한다.
SELECT SAL
FROM EMP;
--==>>
/*
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
*/

SELECT SUM(SAL)
FROM EMP;
--==>> 29025

SELECT ENAME, SUM(SAL)
FROM EMP;
--==>> 에러 발생
--     (ORA-00937: not a single-group group function)

SELECT SUM(SAL) -- 800 + 1600 + 1250 + ... + 1300
FROM EMP;
--==>> 29025

SELECT COMM
FROM EMP;
--==>>
/*
(null)
300
500
(null)
1400
(null)
(null)
(null)
(null)
0
(null)
(null)
(null)
(null)
*/

SELECT SUM(COMM)   -- (null) + 300 + 500 + ... + (null)
FROM EMP;
--==>> 2200


--○ COUNT() 행(레코드)의 갯수 조회 → 데이터가 몇 건인지 확인...
SELECT COUNT(ENAME)
FROM EMP;
--==>> 14

SELECT COUNT(COMM) -- COMM 컬럼 행의 갯수 조회 → NULL은 제외~!!!
FROM EMP;
--==>> 4

SELECT COUNT(*)
FROM EMP;
--==>> 14
-- 일반적으로는 행의 갯수를 쓰게 되기 때문에 보통 이렇게 사용


--○ AVG() 평균 반환
SELECT SUM(SAL) / COUNT(SAL) "RESULT1" -- 2073.214285714285714285714285714285714286
     , AVG(SAL) "RESULT2"              -- 2073.214285714285714285714285714285714286
FROM EMP;

SELECT SUM(COMM) / COUNT(COMM) "RESULT1" -- 550
     , AVG(COMM) "RESULT2"               -- 550  
FROM EMP;
-- 제대로 된 값 아님 원랜 14로 나눠야지

SELECT SUM(COMM) / COUNT(*) "RESULT"
FROM EMP;
--==>> 157.142857142857142857142857142857142857

--※ 데이터가 NULL인 컬럼의 레코드는 연산 대상에서 제외되기 때문에
--   주의하여 연산 처리해야 한다.


--○ VARIANCE(), STDDEV() 
--   ※ 표준편차의 제곱이 분산, 분산의 제곱근이 표준편차

SELECT VARIANCE(SAL), STDDEV(SAL)
FROM EMP;
--==>> 1398313.87362637362637362637362637362637     
--     1182.503223516271699458653359613061928508

SELECT POWER(STDDEV(SAL), 2) "RESULT1"
     , VARIANCE(SAL) "RESULT2"
FROM EMP;
--==>> 1398313.87362637362637362637362637362637        
--     1398313.87362637362637362637362637362637

SELECT SQRT(VARIANCE(SAL)) "RESULT1"
     , STDDEV(SAL) "RESULT2"
FROM EMP;
--==>> 1182.503223516271699458653359613061928508    
--     1182.503223516271699458653359613061928508

--○ MAX() / MIN()
--  최대값 / 최소값
SELECT MAX(SAL) "RESULT1"
     , MIN(SAL) "RESULT2"
FROM EMP;
--==>> 5000    800

--※ 주의
SELECT ENAME, SUM(SAL)
FROM EMP;
--==>> 에러 발생
--     (ORA-00937: not a single-group group function)

SELECT DEPTNO, SUM(SAL)
FROM EMP;
--==>> 에러 발생
--     (ORA-00937: not a single-group group function)

SELECT DEPTNO, SUM(SAL) -- 묶은 거에서 얘가 진행돼서 에러 안 남
FROM EMP
GROUP BY DEPTNO; -- 묶음처리가 먼저 진행
--==>>
/*
30    9400
20    10875
10    8750
*/

SELECT DEPTNO, SAL
FROM EMP
ORDER BY 1;
--==>>
/*
10    2450 ┐
10    5000 │8750
10    1300 ┘
20    2975 ┐
20    3000 │
20    1100 │10875
20    800  │
20    3000 ┘
30    1250 ┐
30    1500 │
30    1600 │9400
30    950  │
30    2850 │
30    1250 ┘
*/


SELECT DEPTNO, SUM(SAL)
FROM EMP
GROUP BY DEPTNO
ORDER BY 1;
--==>>
/*
10    8750
20    10875
30    9400
*/