Web develop/SQL

[SQL/ORACLE] 그룹함수, DECODE 함수

ForA 2019. 5. 29. 12:09
728x90

: 집계 함수

  • 전체데이터를 그룹별로 구분하여 통계적인 결과를 구하기 위해 사용
  • 결과값은 항상 단행
  • 그룹함수와 단순컬럼은 함께 사용하는 것이 불가능
    (만약 그룹함수와 함께 사용하고자 하는 컬럼이 그룹으로 묶여질 수 있다면
    group by절과 함께 사용하는 것이 가능)
  • NULL은 결과값에서 제외

GROUP BY / HAVING

group by(그룹을 묶을 수 있는) 컬럼명
group by deptno--> (10번부서의 사원들) , (20번 부서의 사원들), (30번 부서의 사원들)

having (그룹에 대한) 조건식--> group by와 반드시 함께 사용
having deptno = 10 --3개의 그룹중 10번부서의 사원들만
having avg(sal) >= 2000 -- 10번, 20번, 30번 부서 각각의 평균 급여를 비교

그룹함수 종류

SUM(총합), AVG(평균), COUNT(행갯수), MIN(최소값), MAX(최대값),
STDDEV(표준편차), VARIANCE(분산)

-- COUNT. 모든 행의 갯수 구하기
SELECT COUNT(*) FROM emp;

-- MIN. 오래된 날짜 구하기
SELECT MIN(TO_CHAR(hiredate,'yyyy-mm-dd')) 오래된입사일 from emp;

-- AVG. 평균급여 출력
SELECT deptno, avg(sal) FROM emp GROUP BY deptno HAVING avg(sal)>=2000;

--  SELECT empno, ename, sal FROM emp WHERE AVG(sal)<sal;
--> 에러발생. group function. WHERE절에서는 그룹함수 사용 불가

SELECT deptno, AVG(sal) FROM emp WHERE sal>=1000 
GROUP BY deptno HAVING AVG(sal)>=2000;
-- 서브쿼리사용
SELECT empno, ename, sal FROM emp WHERE sal>= (SELECT avg(sal) FROM emp);

그룹함수와 일반컬럼 사용

select count(*) from emp;   (O)
select deptno, count(*) from emp;  (X)
select deptno, count(*) from emp group by deptno;  (O)
select decode(1,2,3), count(*) from emp;  (X)
select decode(1,2,3), count(*) from emp group by decode(1,2,3);  (O)

DECODE 함수

DECODE (컬럼명,
비교데이터1, 결과데이터1,
비교데이터2, 결과데이터2,
비교데이터3, 결과데이터3 ...)
							
SELECT empno, ename, deptno, decode(deptno,
10,'ACCOUNTING',
20,'RESEARCH',
30,'SALES',
40,'OPERATIONS') 부서명 FROM emp ;

-- deptno 홀짝 구분
SELECT empno, ename, deptno, decode(mod(empno,2),
0,'짝수',
1,'홀수') 사원번호 FROM emp;