4. ORACLE 함수(Function) :: 그룹 함수 정리

2024. 5. 31. 14:55·Oracle DataBase
목차
  1. 그룹 함수
  2. (1) 기본 그룹함수
  3. (2) 그룹을 새로 만드는 방법 :: GROUP BY
  4. (3) GROUP BY의 조건문 :: HAVING
  5. (4) ROLLUP과 CUBE
  6. 결과값에 별칭 붙이기 :: GROUPING
  7. GROUPING SETS

그룹 함수

테이블의 데이터를 집계하는 함수, 집계 결과는 1개만 출력이 되기 때문에 컬럼 선택에 제한이 있다.

(1) 기본 그룹함수

구분 설명(그룹=선택한 컬럼) 비고
SUM(컬럼) 합계  
AVG(컬럼) 평균  
COUNT(컬럼/*) 총 개수(ROW=데이터수) - 컬럼 : null인 row를 제외하고 계산 
- * : 컬럼에 한개라도 값이 있으면 포함해서 계산
MAX(컬럼) 최대값 없는 데이터면 null 출력
MIN(컬럼) 최소값  
  • sum, avg
**@ 다른 컬럼을 추가할 수 없다: 한번에 한개만 조회 가능**
select sum(salary), **emp_name**
from employee;
-- 에러발생: "ORA-00937: 단일 그룹의 그룹 함수가 아닙니다."

**@ 단, 그룹합수끼리는 추가조회가 가능하다**
select sum(salary), avg(salary)
from employee
where dept_code = 'D5';

@ **where 절을 사용하면 필터된 row만으로 계산할 수 있다
		-> 조건에 맞는 데이터를 선별해서 계산 진행**
-- 부서가 D5인 사원 급여 합계를 구하자
select sum(salary)
from employee
**where dept_code = 'D5';

@ null 값은 그냥 제외하고 계산하므로 예외처리를 해줘야한다.**
select sum(bonus), avg(nvl(bonus,0))
from employee;
  • count
@ (컬럼명) 입력시 부서 null인 데이터는 아예 제외됨
select count(*) as 사원수, count(dept_code)
from employee;

-- 보너스를 받는 사원의 수
SELECT COUNT(*)
FROM EMPLOYEE
WHERE BONUS IS NOT NULL;
-- 같은 값
SELECT COUNT(BONUS)
FROM EMPLOYEE;

 

(2) 그룹을 새로 만드는 방법 :: GROUP BY

여러개의 결과값을 산출하기 위해 ROW를 특정 컬럼을 기준으로 한개 그룹으로 설정하는 것

from 뒤에 작성 → GROUP BY 칼럼명

@ 작성법
SELECT 컬럼명
FROM 테이블명
[WHERE 조건식]
[**GROUP BY 컬럼명[, 컬럼명,...]**]

-- 부서별 급여합계 조회하기
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;
-- 부서별 평균 급여, 합계, 사원수 조회
SELECT NVL(DEPT_CODE, '인턴'), AVG(SALARY), SUM(SALARY), COUNT(*)
FROM EMPLOYEE
GROUP BY DEPT_CODE;

@ 다수의 컬럼 설정도 가능하다: 직책코드와 부서코드가 같은 사람이 하나의 그룹으로 설정됨
SELECT JOB_CODE,  DEPT_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY JOB_CODE, DEPT_CODE;

 

(3) GROUP BY의 조건문 :: HAVING

  • WHERE절에는 그룹함수를 쓸 수 없음 → WHERE SALARY = MAX(SALARY); ❌
    → 그룹 설정시 추가 조건을 HAVING을 통해 기술
@ 작성위치: GROUP BY 밑
GROUP BY 칼럼명
HAVING 조건식

-- 부서 **인원수가 3명 이상**인 부서
SELECT DEPT_CODE, **COUNT(*)**
FROM EMPLOYEE
GROUP BY DEPT_CODE
**HAVING COUNT(*) >= 3;**

-- 매니저가 관리하는 사원이 2명 이상인 아이디
****SELECT MANAGER_ID, COUNT(*)
FROM EMPLOYEE
WHERE MANAGER_ID IS NOT NULL
GROUP BY MANAGER_ID
HAVING COUNT(*) >= 2;
-- 같은 결과
SELECT MANAGER_ID, COUNT(MANAGER_ID)
FROM EMPLOYEE
GROUP BY MANAGER_ID
HAVING COUNT(MANAGER_ID) >= 2;

 

(4) ROLLUP과 CUBE

특별히 지정한 칼럼에 한해 추가적으로 해당 칼럼의 집계 결과 반환

즉, 그룹을 나누지 않았을 때의 집계까지 한번에 진행할 때 사용

  • 매개변수가 하나일 때는 롤업과 큐브의 실행 면에서는 차이 없음
    → A, 전체 결과 출력
    • 롤업은 테이블 하단, 큐브는 테이블 상단에 결과 출력
    -- 기본 GROUP일 때
    -- 부서별 인원수
    select dept_code, count(*)
    from employee
    where dept_code is not null
    group by dept_code;
    -- 부서가 있는 모든 사원수
    select count(*)
    from employee
    where dept_code is not null;
    
    -- 위 두개를 한번에 출력하고자 할 때 사용한다.
    -- ROLLUP
    select dept_code, count(*)
    from employee
    where dept_code is not null
    group by rollup(dept_code);
    -- CUBE
    select dept_code, count(*)
    from employee
    where dept_code is not null
    group by cube(dept_code);
    
  • 매개변수가 두개 이상일 때
    • ROLLUP(A, B) → A && B, A, 전체 결과를 맨 아래에 출력
    • CUBE(A,B) → A && B, A, B, 전체 결과를 맨 위에 출력
@ ROLLUP
select dept_code, job_code, count(*)
from employee
where dept_code is not null
group by rollup(dept_code, job_code);
=> dept && job, dept, all

--학번 A112113인 학생의 년도, 학기별 평점
select nvl(substr(term_no, 1, 4), ' ') 년도, nvl(substr(term_no, 5, 2), ' ') 학기, 
				round(avg(point), 1) 평점 --그룹으로 묶었기 때문에 일반 컬럼은 사용이 어렵다
from tb_grade
where student_no = 'A112113'
group by rollup (substr(term_no, 1, 4), substr(term_no, 5, 2))
order by substr(term_no, 1, 4);

@ CUBE
select dept_code, job_code, count(*)
from employee
where dept_code is not null
group by CUBE(dept_code, job_code);
=> dept && job, dept, job, all

 

결과값에 별칭 붙이기 :: GROUPING

null일때 1, 아닐 때 0를 의미

해당 그룹으로 분류된 것인지 확인할 때 사용

  • 예시 sql문
SELECT 
    CASE
        WHEN GROUPING(DEPT_CODE) = 0 AND GROUPING(JOB_CODE) = 1 THEN '부서별 인원수'
        WHEN GROUPING(DEPT_CODE) = 1 AND GROUPING(JOB_CODE) = 0 THEN '직책별 인원수'
        WHEN GROUPING(DEPT_CODE) = 1 AND GROUPING(JOB_CODE) = 1 THEN '총 인원수'
        ELSE '직책부서별 인원수'
    END AS 구분,
    COUNT(*), DEPT_CODE, JOB_CODE
FROM EMPLOYEE
GROUP BY CUBE(DEPT_CODE, JOB_CODE)
ORDER BY 1;
  • 출력 결과
    • 지정한 그룹별로 모여 가상 컬럼이 만들어져 인원수를 세는 것을 확인할 수 있다.

GROUPING SETS

여러 select문을 하나로 합친 결과를 원할 때 사용하는 것

  • 조금더 다양한 그룹화 조합을 계산할 수 있다.
    => 다양한 집계 결과가 필요한 분석 수행시 사용한다.
  • 예시 sql
SELECT
    column1,
    column2,
    SUM(measure_column) AS total
FROM
    table_name
GROUP BY
    GROUPING SETS (
        (column1, column2), --column1과 column2로 그룹화
        (column1), --column1만으로 그룹화
        (column2),--column2만으로 그룹화
        () --전체 합계
    );



반응형

'Oracle DataBase' 카테고리의 다른 글

6. ORACLE 정리 :: 서브쿼리(SUBQUERY) - 단일행, 다중행, 다중열, 상관, 스칼라  (2) 2024.06.04
5. ORACLE 정리 :: 집합 연산자(UNION)와 JOIN문  (0) 2024.06.03
3. ORACLE 함수(Function) :: 단일행 함수 정리  (3) 2024.05.31
2. ORACLE 연산자 정리 :: 비교연산자, 논리연산자, 연결연산자  (0) 2024.05.14
1. ORACLE :: DataBase와 SQL Developer 사용하기  (0) 2024.04.29
  1. 그룹 함수
  2. (1) 기본 그룹함수
  3. (2) 그룹을 새로 만드는 방법 :: GROUP BY
  4. (3) GROUP BY의 조건문 :: HAVING
  5. (4) ROLLUP과 CUBE
  6. 결과값에 별칭 붙이기 :: GROUPING
  7. GROUPING SETS
'Oracle DataBase' 카테고리의 다른 글
  • 6. ORACLE 정리 :: 서브쿼리(SUBQUERY) - 단일행, 다중행, 다중열, 상관, 스칼라
  • 5. ORACLE 정리 :: 집합 연산자(UNION)와 JOIN문
  • 3. ORACLE 함수(Function) :: 단일행 함수 정리
  • 2. ORACLE 연산자 정리 :: 비교연산자, 논리연산자, 연결연산자
JinHyung-dev
JinHyung-dev
틈틈이 기록하고 있습니다!!
  • JinHyung-dev
    JinHyung's 블로그
    JinHyung-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (34)
      • JAVA (18)
      • Oracle DataBase (12)
      • 프리코스 (4)
  • 인기 글

  • 반응형
  • 최근 댓글

  • 최근 글

  • 태그

    백엔드
    개발자
    요약
    DB
    자바
    정리
    Java
    SQL
    oracle
    공부
  • hELLO· Designed By정상우.v4.10.0
JinHyung-dev
4. ORACLE 함수(Function) :: 그룹 함수 정리

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.