[MSSQL] GROUP BY 절 사용법 (그룹별 집계)

SQL Server에서 GROUP BY 절은 특정 칼럼을 기준으로 집계 함수를 사용하여 건수(COUNT), 합계(SUM), 평균(AVG) 등 집 계성 데이터를 추출할 때 사용한다. GROUP BY 절에서 기준 칼럼을 여러 개 지정할 수 있으며, HAVING 절을 함께 사용하면 집계 함수를 사용하여 WHERE 절의 조건절처럼 조건을 부여할 수 있다. GROUP BY 절은 중복제거를 할 때도 사용 가능하다. SQL Server에서는 GROUP BY 절을 사용할 경우 그룹 칼럼을 기준으로 자동으로 ORDER BY가 되지만 명시적으로 ORDER BY를 사용하여 쿼리문을 작성하는 것이 좋다.

 

MSSQL GROUP BY 절 사용법

목차
  1. 기본적인 GROUP BY 절 사용법
  2. GROUP BY 절에서 조건절(HAVING) 사용법
  3. GROUP 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 함수는 문자열 칼럼의 값을 하나의 칼럼으로 합치는 경우 사용한다.

예제쿼리(테이블포함).txt
0.00MB

 

 

[MSSQL] 중복 제거 (DISTINCT, GROUP BY)

SQL Server에서 중복된 행을 제거하고 한 번만 표시하고 싶다면 DISTINCT를 사용하면 된다. 중복 행을 제거하는 방법은 DISTINCT 사용하는 방법 외에도 GROUP BY 절을 사용해서 중복 행을 제거할 수 있다. G

gent.tistory.com

 

[MSSQL] STRING_AGG 함수 사용법 (칼럼 합치기)

SQL Server 2017 이상의 버전에서는 여러 행의 컬럼 값을 하나의 컬럼으로 합칠 때에는 STRING_AGG() 함수를 사용하면 된다. 오라클 SQL의 LISTAGG() 함수와 비슷한 기능을 수행한다. SQL Server 2017 이전 버전..

gent.tistory.com

 

[MSSQL] ORDER BY 절 사용법 (정렬 순서 지정)

SQL Server에서 SELECT 된 데이터를 정렬하기 위해서는 ORDER BY 절을 사용하면 된다. 정렬할 칼럼을 오름차순(ASC), 내림차순(DESC)으로 조회 순서를 지정할 수 있다. MySQL에서 LIMIT를 사용하듯 SQL Server에

gent.tistory.com

 

댓글

Designed by JB FACTORY