본문 바로가기
✨ DBMS/Oracle

[Oracle / SQL] 그룹함수 -1

by 환풍 2023. 4. 13.
728x90

 GROUP BY를 쓰면 SELECT 절에 올 수 있는 컬럼이 정해져있다.

 1. 그룹핑한 컬럼 ( 아래에는 DEPTNO를 그룹핑했으니 DEPTNO가 올 수 있는것.)
 2. 그룹함수 (데이터가 딱 1개 조회되는거)

그룹 함수란?

테이블의 전체 행을 하나 이상의 컬럼을 기준으로 컬럼값에 따라 그룹화하여 그룹별로 결과를 출력하는 함수이고
복수행 함수라고도 한다.
그룹 함수의 종류에는 COUNT, MAX, MIN, SUM, AVG, STDDEV, VARIANCE 등이 있다.

 

EMP 테이블에는 14개의 데이터가 있다.

 

1
2
SELECT DEPTNO, SUM(SAL)
FROM EMP;
cs

은 무엇이 나올까? 

 

오류가 떨어지는데,

SUM(SAL)은 값이 하나가 나온다. 하지만 DEPTNO는 사원 수만큼 나온다. 만약 100명이면 100개의 조회결과가 나온다.

즉, DEPTNO는 100개가 나오고, SUM(SAL)은 1개가 나오니까 행의 수가 일치하지 않아서 오류가 난다.

 

 

 

1
2
3
SELECT DEPTNO, SUM(SAL)
FROM EMP
GROUP BY DEPTNO;
cs

부서별로 급여의 총합을 조회해보았다.

이렇게 DEPTNO로 그룹을 지어주면 

정상적으로 데이터가 나오는 것을 볼 수 있다.

 

부서별로 급여의 총합, 급여의 평균, 부서원 수 조회

 

EX-1)

  직급별 인원수 및 해당 직급에서 가장 높은 급여 및  가장 낮은 급여를 조회.

단 , 직급이 '사장'인사람 빼고.

1
2
3
4
SELECT MAX(SAL), MIN(SAL) , JOB
FROM EMP
WHERE JOB != '사장'
GROUP BY JOB;
cs

 

 

EX-2)

  직급별 해당 직급에서 가장 높은 급여 및  가장 낮은 급여를 조회.

단 ,  직급별 최소 급여가 300 이상인 데이터.

 

1
2
3
4
SELECT MAX(SAL), MIN(SAL) , JOB
FROM EMP
GROUP BY JOB
HAVING MIN(SAL) >= 300 ;
cs

HAVING은 GROUP BY 한 상태에서만 쓸 수 있다.

 

 

EX-3)

 부서별로 부서번호, 급여의 합, 커미션의 합 , 커미션 평균을 조회하는데 10번 부서는 제외하고 부서별 급여의 합이 300 미만 부서도 제외하고, 부서번호 기준 내림차순으로 정렬.

1
2
3
4
5
6
SELECT DEPTNO, SUM(SAL), SUM(NVL(COMM,0)) , AVG(NVL(COMM,0))
FROM EMP
WHERE DEPTNO != 10
GROUP BY DEPTNO
HAVING  SUM(SAL) >= 300
ORDER BY DEPTNO DESC;
cs

반응형

댓글