Oracle DBA/SQL

20230627 (1) SQL 038 : 평균값 출력하기 (AVG)

Nuez 2023. 6. 27. 10:42
반응형

예제. 사원테이블에서 평균 월급을 출력하시오. 

SELECT AVG(sal) AS "평균 월급"
FROM emp;


문제 168. 위의 결과를 다시 출력하는데 소수점 이하가 안나오게 반올림하시오. 

SELECT ROUND(AVG(sal)) AS "평균 월급"
FROM emp;

* 참고 : ROUND(AVG(sal))는 ROUND(AVG(sal),0) 과 같은 결과를 반환함.


문제 170. 사원 테이블에서 직업, 직업별 평균 월급을 출력하시오. 

SELECT JOB, ROUND(AVG(sal))
FROM emp
GROUP BY JOB;


문제 171. 위의 결과를 다시 출력하는데 직업별 평균 월급이 높은 것부터 출력하시오. 

SELECT JOB, ROUND(AVG(sal))
FROM emp 
GROUP BY JOB
ORDER BY 2 DESC;


문제 172. 문제 171번을 다시 수행하는데 직업이 SALESMAN은 제외하고 출력하시오.

SELECT job, ROUND(AVG(sal))
FROM emp
WHERE job != 'SALESMAN'
GROUP BY job
ORDER BY 2 DESC;

코딩 순서 : SELECT - FROM - WHERE - GROUP BY - ORDER BY

실행 순서 : FROM - WHERE - GROUP BY - SELECT - ORDER BY

 

FROM : emp 테이블에서

WHERE : 직업이 SALESMAN이 아닌 행을

GROUP BY : 직업으로 그룹화하여

SELECT : 직업으로 그룹화하여

ORDER BY : 평균 월급을 내림차순으로 정렬하라


문제 173. 이름과 커미션을 출력하시오. 

SELECT ename, comm
FROM emp;


문제 174. 커미션의 평균값을 출력하시오. 

SELECT AVG(comm) as "평균 커미션"
FROM emp;


그룹함수는 NULL 값을 무시함. 따라서 null이 아닌 사원들의 평균값만 계산 함. 

* 평균값을 출력할 때는 NULL값 처리를 어떻게 할지 생각하면서 SQL을 작성해야 함. 

즉, 데이터를 먼저 보고 판단


문제 175. 위의 결과를 다시 출력하는데 전체 사원수로 나눠져서 평균 커미션이 계산되게 하시오. 

SELECT round(AVG(nvl(comm, 0))) as "평균 커미션"
FROM emp;


문제 176. 커미션의 결측치가 몇 개가 있는지 확인하시오. 

(커미션의 NULL값이 몇 개가 있는지 조회하시오.)

SELECT COUNT(*)
FROM emp
WHERE comm IS NULL;


* 주의1 : 기타 비교 연산자는 IS NULL로 작성해야함. comm = null 하면 결과 반환 x. 

SELECT COUNT(*)
FROM emp
WHERE comm = NULL;


* 주의2: COUNT를 사용할 때는 *(모든 컬럼)을 써야 null 값을 무시하지 않고 데이터를 잘 가져올 수 있다. (OCP시험용) 

 

count(*) 대신 count(comm)을 사용한 케이스 (잘못된 케이스)

SELECT COUNT(comm)
FROM emp
WHERE comm IS NULL;

그룹함수는 null값을 무시하므로, null값만 있는 행 중에서 갯수를 세라고 하면 결과를 반환해주지 못하는 것. 
count(*)로 작성해야 함.


문제 177. 부서번호, 부서번호별 평균 월급을 출력하시오. 

(부서번호별 평균 월급을 출력할 때 소수점 이하는 안나오게 반올림하시오.)

 

1단계 : 월급 컬럼에 null 값이 있는지 확인 

SELECT COUNT(*) 
FROM emp 
WHERE sal IS NULL;

2단계: null 값이 없으므로 별 다른 처리 없이 부서별 평균 월급 계산

SELECT deptno, round(AVG(sal))
FROM emp
GROUP BY deptno;