<집계 함수 (그룹 함수)>
-
집계 함수 (Aggregate function): AVG(평균), COUNT(개수), MAX(최대값), MIN(최소값), SUM(합계)
SELECT [그룹열], 그룹 함수 (열 이름)
FROM 테이블명
WHERE 조건
GROUP BY 그룹명
HAVING 그룹 조건
ORDER BY 열이름
-
COUNT: 행의 개수 출력 (null값은 제외됨)
-
employees 테이블의 행의 개수 출력
1
2
|
SELECT COUNT(*)
FROM employees;
|
cs |
-
employees 테이블에서 commission_pct의 개수 출력
1
2
|
SELECT COUNT(commission_pct)
FROM employees;
|
cs |
-
null값도 세고 싶다면?
1
2
|
SELECT COUNT(NVL(commission_pct,0))
FROM employees;
|
cs |
-
MAX, MIN: 최대값과 최소값 employees 테이블에서 salary의 가장 큰 값과 작은 값 출력
1
2
|
SELECT MAX(salary), MIN(salary)
FROM employees;
|
cs |
-
employees 테이블의 부서의 개수 출력
1
2
|
SELECT COUNT(DISTINCT department_id)
FROM employees;
|
cs |
-
employees 테이블에서 department_id가 90인 부서의 직원 수 출력
1
2
3
|
SELECT COUNT(employee_id)
FROM employees
WHERE department_id = 90;
|
cs |
-
MAX, MIN 함수를 문자열에 적용
1
2
|
SELECT MAX(first_name), MIN(first_name)
FROM employees;
|
cs |
-
MAX, MIN 함수를 문자열에 적용 MAX(hire_date)는 가장 최근날짜, MIN(hire_date)는 가장 오래된 날짜.
1
2
|
SELECT MAX(hire_date), MIN(hire_date)
FROM employees;
|
cs |
-
SUM, AVG : 합계와 평균 (숫자만 가능)
1
2
|
SELECT SUM(salary), AVG(salary)
FROM employees;
|
cs |
-
employees 테이블에서 commission_pct의 평균값을 출력 (널값은 제외)
1
2
|
SELECT AVG(commission_pct)
FROM employees;
|
cs |
-
각 부서별로 집계 함수를 내려면 필요한 것이 GROUP BY절
-
employees 테이블에서 department_id별 salary의 평균을 평균급여 이름으로 출력
1
2
3
|
SELECT department_id, ROUND(AVG(salary)) 평균급여
FROM employees
GROUP BY department_id;
|
cs |
-
employees 테이블에서 department_id별 salary의 평균을 평균급여 이름으로, salary의 합계를 총급여합계로, department_id를 부서번호로, 부서인원수 출력
1
2
3
4
5
6
|
SELECT department_id 부서번호,
ROUND(AVG(salary)) 평균급여,
SUM(salary) 총급여합계,
COUNT(*) 부서인원수
FROM employees
GROUP BY department_id;
|
cs |
-
employees 테이블에서 department_id별, job_id별 salary의 평균을 평균급여 이름으로, salary의 합계를 총급여합계로, department_id를 부서번호로, 부서인원수를 부서별 직업별 인원수로 출력
1
2
3
4
5
6
7
|
SELECT department_id 부서번호, job_id 직업번호,
ROUND(AVG(salary)) 평균급여,
SUM(salary) 총급여합계,
COUNT(*) "부서별 직업별 인원수"
FROM employees
GROUP BY department_id, job_id
ORDER BY 부서번호 ASC;
|
cs |
-
HAVING 절: 그룹 함수를 이용한 조건절
1
2
3
4
5
|
SELECT department_id 부서번호, SUM(salary) 급여합계
FROM employees
WHERE SUM(salary) > 100000 --그룹함수 사용 에러
GROUP BY department_id
ORDER BY department_id;
|
cs |
-
WHERE절에 salary의 합계가 10000이 넘는 부서번호와 급여합계를 구하면 에러가난다.
-
WHERE절 대신에 HAVING절 사용
1
2
3
4
5
|
SELECT department_id 부서번호, SUM(salary) 급여합계
FROM employees
GROUP BY department_id
HAVING SUM(salary) > 100000
ORDER BY department_id;
|
cs |
<집계 함수 예제>
-
employees 테이블에서 부서별 사원수, 최대급여, 최소급여, 급여합계, 평균급여를 급여합계 큰순으로 출력
1
2
3
4
5
6
7
|
SELECT department_id, MAX(salary) 최대급여,
MIN(salary) 최소급여,
SUM(salary) 급여합계,
ROUND(AVG(salary)) 평균급여
FROM employees
GROUP BY department_id
ORDER BY 급여합계 DESC;
|
cs |
-
employees 테이블에서 부서별, 직업별(job_id), 상사번호(manager_id)별로 그룹을 지어 salary 합계와 그룹별 직원의 숫자를 출력
1
2
3
4
5
6
7
8
|
SELECT department_id 부서번호,
job_id 직업,
manager_id 상사번호,
SUM(salary) 월급합계,
COUNT(*) 직원수
FROM employees
GROUP BY department_id, job_id, manager_id
ORDER BY 부서번호;
|
cs |
-
부서별로 최고 월급을 뽑아서 평균을 내고, 최저 월급 또한 평균을 내어 출력
1
2
3
4
|
SELECT ROUND(AVG(MAX(salary))) 부서별최고월급평균,
ROUND(AVG(MIN(salary))) 부서별최저월급평균
FROM employees
GROUP BY department_id;
|
cs |
-
직종별 평균 월급이 $10000을 초과하는 직종에 대해서 job_id와 월급여 합계를 조회. 어카운트 매니저 (AC_MGR)은 제외하고 월 급여 합계로 내림차순 정렬
1
2
3
4
5
6
|
SELECT job_id 직종, SUM(salary) 월급여합계
FROM employees
WHERE job_id NOT IN ('AC_MGR')
GROUP BY job_id
HAVING AVG(salary) > 10000
ORDER BY 월급여합계 DESC;
|
cs |
-
부서번호 40을 제외한 부서별 평균 급여가 7000이하인 부서들의 평균 급여를 출력
1
2
3
4
5
|
SELECT department_id 부서번호, ROUND(AVG(salary)) 평균급여
FROM employees
WHERE department_id NOT IN ('40')
GROUP BY department_id
HAVING AVG(salary) <= 7000;
|
cs |
-
직종별로 월급의 합계가 13000이상인 직종을 출력. 급여총액으로 내림차순 정렬하고 직종(job_id)에 'REP'들어있는 직종은 제외
1
2
3
4
5
6
|
SELECT job_id, SUM(salary) 급여총액
FROM employees
WHERE job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING SUM(salary) >= 13000
ORDER BY 급여총액 DESC;
|
cs |
'Learning > SQL' 카테고리의 다른 글
조인 (JOIN) - 비 동등조인 (0) | 2020.06.17 |
---|---|
조인 (JOIN) - 동등조인 (0) | 2020.06.17 |
DECODE 함수, CASE 함수 (0) | 2020.06.16 |
NULL 관련 함수 (0) | 2020.06.16 |
변환형 함수 (0) | 2020.06.16 |