Search

그룹 함수(Group Function)

대분류
DB
소분류
MySQL
주요 레퍼런스
https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-WITH-ROLLUP
https://gent.tistory.com/584#google_vignette
https://blog.naver.com/platinasnow/220400168429
수준
심화
태그
WITH ROLLUP
GROUPING SETS
GROUPING
최종 편집 일시
2024/10/27 15:23
생성 일시
2024/09/28 15:47
13 more properties

그룹함수

그룹별 소계 및 중계 등 중간 합계 분석 데이터 산출
GROUP BY문에서 사용
하나 이상의 컬럼을 기준으로 컬럼값에 따라 그룹화 하여 그룹별로 출력
SELECT문 뒤에 나오는 컬럼명반드시 GROUP BY(집계 대상 아닌 경우)문 또는 그룹함수 뒤(집계대상)에 포함되어 있어야 한다.
단순 컬럼명만! 집계함수 등은 미포함!
집계함수를 사용했을 경우 집계함수에 포함되지 않는 칼럼들은 그룹화를 해줘야 한다.
그룹함수
반환 값
ROLLUP
컬럼 간 순서에 따라 다른 결과 출력
주어진 컬럼을 기준으로 그룹별 소계 구하여 해당 필드에 추가
CUBE
컬럼 간 순서에 따라 다른 결과 출력
주어진 컬럼을 기준으로 모든 조합의 그룹별 소계를 구하여 해당 필드에 추가
GROUPING SETS
컬럼 간 순서와 무관한 결과 출력
주어진 컬럼들에 대한 다양한 소계 집합을 구하는 함수
소계 : 전체가 아닌 어느 한 부분만을 셈한 합계
합계 ≒ 계 : 한데 합하여 계산함
총계 : 전체를 한데 모아서 계산함.

MySQL 그룹함수

예시 테이블
region_name
store_name
sales
West
Los Angeles
1500
West
San Diego
250
West
Los Angeles
300
East
Boston
700

WITH ROLLUP

그룹별로 합계를 한번에 구할때 사용

전체 소계

SELECT store_name , SUM(sales) FROM store_info GROUP BY store_name WITH ROLLUP
SQL
복사
store_name
SUM(sales)
Boston
700
Los Angeles
1800
San Diego
250
NULL
2750

부분 소계

SELECT region_namee , store_name , SUM(sales) FROM store_info GROUP BY region_name , store_name WITH ROLLUP
SQL
복사
region_name
store_name
SUM(sales)
East
Boston
700
East
NULL
700
West
Los Angeles
1800
West
San Diego
250
West
NULL
2050
NULL
NULL
2750

GROUPING : null값 명명법 (MYSQL 8.0 이상)

SELECT region_namee , store_name , SUM(sales) , GROUPING(region_name) , GROUPING(store_name) FROM store_info GROUP BY region_name , store_name WITH ROLLUP
SQL
복사
region_name
store_name
SUM(sales)
GROUPING(region_name)
GROUPING(store_name)
East
Boston
700
0
0
East
NULL
700
0
1
West
Los Angeles
1800
0
0
West
San Diego
250
0
0
West
NULL
2050
0
1
NULL
NULL
2750
1
1

정렬 : ORDER BY ~ IS NULL

값을 정렬하는 것이 아닌 NULL의 유무로 정렬
ROLLUP과 ORDER BY는 같이 사용 불가능
그래서 ROLLUP을 사용한 쿼리를 서브쿼리로 작성한 다음 외부 쿼리에서 ORDER BY를 사용해줘야 함.
WITH department_summary AS ( SELECT dept -- 팀 , employ_num, -- 사번 , SUM(work_time) AS work_time -- 근무시간 FROM department GROUP BY dept, employ_num WITH ROLLUP ) SELECT * FROM department_summary ORDER BY dept IS NULL -- 전체 소계가 마지막에 오도록 정렬 , dept , employ_num IS NULL -- 부서별 소계가 앞쪽에 오도록 정렬 , work_time DESC -- 근무시간 내림차순으로 정렬 ;
SQL
복사