Search
Duplicate
moon
sun

그룹 관련 함수

그룹 관련 함수

ROLLUP(인자1, 인자2, ...)
그룹 기준으로 집계한 정보를 레벨별로 출력하는 함수 ex : (컬럼1, 컬럼2), (컬럼1), (전체)
CUBE(인자1, 인자2, ...)
그룹 기준으로 집계한 정보를 가능한 모든 조합별로 출력하는 함수 ex : (컬럼1, 컬럼2), (컬럼1), (컬럼2), (전체)
GROUPING SETS(인자1, 인자2, ...)
그룹 컬럼이 여러 개 일 때, 집계한 정보를 컬럼별로 출력하는 함수 ex : GROUPING SETS( (컬럼1, 컬럼2), (컬럼1), () ) ➡ 컬럼1+컬럼2 그룹, 컬럼1 그룹, 전체 를 그룹으로 묶어서 출력
GROUPING()
그룹화한 컬럼들에 대해 그룹화된 여부를 출력하는 함수 - 그룹화 O : 출력 결과 0 - 그룹화 X : 출력 결과 1
LISTAGG( 나열할 컬럼, [구분자] )
( LIST + Aggregate : 목록 + 결합 ) 그룹화된 데이터를 하나의 열에 목록으로 나열하여 출력하는 함수
PIVOT()
그룹화한 행 데이터를 열로 바꾸어서 출력하는 함수
UNPIVOT()
그룹화된 결과인 열을 행 데이터로 바꾸어서 출력하는 함수

그룹관련 함수 구조

SELECT ... FROM ... WHERE ... GROUP BY 그룹관련함수[ ROLLUP | CUBE | ... ]
SQL
복사

PIVOT()

( SELECT 컬럼1, 컬럼2, 컬럼3 FROM 테이블명 ) PIVOT ( 그룹함수( 컬럼명 ) FOR 피벗할 컬럼 IN (1,2,3, ... ) )
SQL
복사

UNPIVOT()

UNPIVOT ( 기준컬럼 FOR 피벗할 컬럼 IN (1,2,3, ... ) )
SQL
복사

HR 스키마 실습코드

ROLLUP

💡
그룹 기준으로 집계한 정보를 레벨별로 출력하는 함수
ROLLUP(인자1, 인자2, ...)
SQL
복사
부서별, 직급별 급여 최댓값, 합계, 평균
ROLLUP 미사용
SELECT dept_code, job_code ,COUNT(*), MAX(salary), SUM(salary), TRUNC( AVG(salary), 2) FROM employee GROUP BY dept_code, job_code ORDER BY dept_code, job_code ;
SQL
복사
ROLLUP 사용 : 그룹 기준으로 집계한 결과와 추가적으로 총 집계 정보 출력하는 함수
SELECT dept_code, job_code ,COUNT(*), MAX(salary), SUM(salary), TRUNC( AVG(salary), 2) FROM employee WHERE dept_code IS NOT NULL AND job_code IS NOT NULL GROUP BY ROLLUP(dept_code, job_code) ORDER BY dept_code, job_code ;
SQL
복사

CUBE

💡
그룹 기준으로 집계한 정보를 가능한 모든 조합별로 출력하는 함수
CUBE(인자1, 인자2, ...)
SQL
복사
SELECT dept_code, job_code ,COUNT(*), MAX(salary), SUM(salary), TRUNC( AVG(salary), 2) FROM employee WHERE dept_code IS NOT NULL AND job_code IS NOT NULL GROUP BY CUBE(dept_code, job_code) ORDER BY dept_code, job_code ;
SQL
복사

GROUPING SETS()

💡
그룹컬럼이 여러 개 일 때, 집계한 정보를 컬럼별로 출력하는 함수
GROUPING SETS(인자1, 인자2, ...)
SQL
복사
각각 부서별, 직급별 별도로 인원 수
SELECT dept_code, job_code, COUNT(*) FROM employee GROUP BY GROUPING SETS( (dept_code), (job_code) ) ORDER BY dept_code, job_code ;
SQL
복사
특정 부서의 직급별 인원 수
SELECT dept_code, job_code, COUNT(*) FROM employee GROUP BY dept_code, job_code ORDER BY dept_code, job_code ;
SQL
복사

GROUPING

💡
그룹화한 컬럼들에 대해 그룹화된 여부를 출력하는 함수
GROUPING()
SQL
복사
그룹화 O : 출력 결과 0
그룹화 X : 출력 결과 1
SELECT dept_code , job_code , COUNT(*) , MAX(salary) , SUM(salary) , TRUNC( AVG(salary), 2) , GROUPING(dept_code) "부서코드 그룹여부" , GROUPING(job_code) "직급코드 그룹여부" FROM employee WHERE dept_code IS NOT NULL AND job_code IS NOT NULL GROUP BY CUBE(dept_code, job_code) ORDER BY dept_code, job_code ;
SQL
복사

LISTAGG

💡
그룹화된 데이터를 하나의 열에 목록으로 나열하여 출력하는 함수
LISTAGG( 나열할 컬럼, [구분자] ) WITHIN GROUP (ORDER BY 정렬기준 컬럼)
SQL
복사
🌟
LISTAGG : LIST + Aggregate : 목록 + 결합
SELECT dept_code 부서코드 ,LISTAGG( emp_name, ', ') WITHIN GROUP(ORDER BY emp_name) "부서별 사원이름목록" FROM employee GROUP BY dept_code ORDER BY dept_code ;
SQL
복사

PIVOT

직급을 행에 표시, 부서는 열에 그룹화하여 최고급여를 출력하시오.
SELECT * FROM ( SELECT dept_code, job_code, salary FROM employee ) PIVOT ( MAX(salary) -- 열에 올릴 컬럼들 FOR dept_code IN ('D1','D2','D3','D4','D5','D6','D7','D8','D9') /* SELECT LISTAGG(dept_id, ',') FROM department */ ) ORDER BY job_code;
SQL
복사
SELECT * FROM ( SELECT dept_code, job_code FROM employee ) PIVOT ( COUNT(*) -- 열에 올릴 컬럼들 FOR dept_code IN ('D1','D2','D3','D4','D5','D6','D7','D8','D9') /* SELECT LISTAGG(dept_id, ',') FROM department */ ) ORDER BY job_code;
SQL
복사

UNPIVOT

SELECT * FROM ( SELECT dept_code ,MAX( DECODE(job_code, 'J1', salary ) ) J1 ,MAX( DECODE(job_code, 'J2', salary ) ) J2 ,MAX( DECODE(job_code, 'J3', salary ) ) J3 ,MAX( DECODE(job_code, 'J4', salary ) ) J4 ,MAX( DECODE(job_code, 'J5', salary ) ) J5 ,MAX( DECODE(job_code, 'J6', salary ) ) J6 ,MAX( DECODE(job_code, 'J7', salary ) ) J7 FROM employee GROUP BY dept_code ORDER BY dept_code ) UNPIVOT ( salary FOR job_code IN (J1, J2, J3, J4, J5, J6, J7) ) ;
SQL
복사