[MSSQL] GROUP BY 절 사용법 (그룹별 집계)
- 데이터베이스/MSSQL
- 2022. 5. 25.
SQL Server에서 GROUP BY 절은 특정 칼럼을 기준으로 집계 함수를 사용하여 건수(COUNT), 합계(SUM), 평균(AVG) 등 집 계성 데이터를 추출할 때 사용한다. GROUP BY 절에서 기준 칼럼을 여러 개 지정할 수 있으며, HAVING 절을 함께 사용하면 집계 함수를 사용하여 WHERE 절의 조건절처럼 조건을 부여할 수 있다. GROUP BY 절은 중복제거를 할 때도 사용 가능하다. SQL Server에서는 GROUP BY 절을 사용할 경우 그룹 칼럼을 기준으로 자동으로 ORDER BY가 되지만 명시적으로 ORDER BY를 사용하여 쿼리문을 작성하는 것이 좋다.
목차 |
기본적인 GROUP BY 절 사용법
SELECT job
, SUM(sal) AS sum_sal
FROM emp
WHERE deptno IN (20, 30)
GROUP BY job
직업(job) 별로 급여(sal) 총합계를 구하는 예제이다.
GROUP BY 절의 칼럼은 SELECT 절에 존재해야 사용할 수 있다.
SELECT 절에서 집계 함수를 제외한 칼럼을 GROUP BY 절에 기술한다고 생각하면 된다.
그룹 칼럼을 여러 개 지정하는 방법
SELECT deptno
, job
, SUM(sal) AS sum_sal
FROM emp
WHERE deptno IN (20, 30)
GROUP BY job, deptno
그룹 칼럼이 여러 개인 경우 첫 번째 칼럼(deptno)으로 먼저 그룹이 묶이고, 두 번째 칼럼(job)으로 집계가 된다.
집계 함수를 여러 개 사용하는 방법
SELECT job
, SUM(sal) AS sum_sal
, COUNT(*) AS count_emp
, SUM(sal) / COUNT(*) AS avg_sal
FROM emp
WHERE deptno IN (20, 30)
GROUP BY job
SELECT 절에서 집계 함수를 여러 개 사용할 수 있으며, 집계 함수끼리 연산도 가능하다.
정렬(ORDER BY)하는 방법
SELECT job
, SUM(sal) AS sum_sal
FROM emp
WHERE deptno IN (20, 30)
GROUP BY job
ORDER BY SUM(sal) DESC, job
GROUP BY 절 하단에 ORDER BY 절을 사용할 수 있으며, GROUP BY 절과 함께 ORDER BY 절을 사용할 경우 ORDER BY 절에서 집계 함수를 사용할 수 있다.
GROUP BY 절에서 조건절(HAVING) 사용법
SELECT job
, SUM(sal) AS sum_sal
FROM emp
WHERE deptno IN (20, 30)
GROUP BY job HAVING SUM(sal) > 5000
급여(sal)의 합계가 5000 보다 큰 직업(job)만 조회하는 예제이다.
집계 함수의 결과를 조건절에 사용하고 싶은 경우 HAVING 절을 사용하면 된다. HAVING 절에 일반 칼럼을 조건으로 부여할 수 있지만, 일반 칼럼은 WHERE 절에서 조건을 부여하는 것이 좋다.
조건을 여러 개 부여하는 방법
SELECT job
, SUM(sal) AS sum_sal
, AVG(sal) AS avg_sal
FROM emp
WHERE deptno IN (20, 30)
GROUP BY job
HAVING SUM(sal) > 5000 AND AVG(sal) > 2000
HAVING 절에서 AND 또는 OR 연산자를 사용하여 여러 개의 조건을 부여할 수 있다.
GROUP BY 절에서 자주 사용하는 집계 함수
집계 함수명 | 설명 | 비고 |
COUNT | 건수 (행의 개수) | 칼럼의 값이 NULL 인 경우 제외 |
SUM | 합계 | |
AVG | 평균 | 칼럼의 값이 NULL 인 경우 제외 |
MAX | 최댓값 | |
MIN | 최솟값 | |
STDEV | 표준편차 | |
VAR | 분산 | |
STRING_AGG | 칼럼 문자열 합치기 | 칼럼의 값이 NULL 인 경우 제외 |
COUNT (건수)
SELECT deptno
, COUNT(*) AS count_1
, COUNT(comm) AS count_2
, COUNT(ISNULL(comm, 0)) AS count_3
FROM emp
WHERE deptno = 30
GROUP BY deptno
COUNT 함수는 행의 건수를 집계할 때 사용한다.
일반적으로 COUNT(*) 형식으로 사용하며, 칼럼의 값이 NULL인 경우를 제외하는 경우 칼럼명을 인자로 사용한다.
SUM (합계), AVG (평균)
SELECT deptno
, SUM(comm) AS sum_comm
, AVG(comm) AS avg_comm_1
, AVG(ISNULL(comm, 0)) AS avg_comm_2
FROM emp
WHERE deptno = 30
GROUP BY deptno
SUM 함수는 해당 칼럼의 모든 값을 합산하며, 수치형 칼럼에만 사용할 수 있다.
AVG 함수는 칼럼 값의 평균을 구하며, 칼럼의 값이 NULL인 경우 제외를 하고 연산을 하니 주의해야 한다.
MIN (최솟값), MAX (최댓값)
SELECT deptno
, MIN(sal) AS min_sal
, MAX(sal) AS max_sal
FROM emp
WHERE deptno = 30
GROUP BY deptno
MIN 함수는 해당 칼럼의 최솟값, MAX 함수는 해당 칼럼의 최댓값을 구한다.
STDEV (표준편차), VAR (분산)
SELECT deptno
, STDEV(sal) AS stdev_sal
, VAR(sal) AS var_sal
FROM emp
WHERE deptno = 30
GROUP BY deptno
STDEV 함수는 표준편차, VAR 함수는 분산을 구할 때 사용한다.
STRING_AGG (칼럼 문자열 합치기)
SELECT deptno
, STRING_AGG(ename, ',') AS enames
FROM emp
WHERE deptno = 30
GROUP BY deptno
STRING_AGG 함수는 문자열 칼럼의 값을 하나의 칼럼으로 합치는 경우 사용한다.