그룹함수
•
그룹별 소계 및 중계 등 중간 합계 분석 데이터 산출
•
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
복사