MSSQL GROUP BY 총 정리 + 그룹별 집계 함수

GROUP BY란?

MSSQL GROUP BY 절에 대해 포스팅하겠습니다.
GROUP BY절은 특정 칼럼들의 데이터를 기준으로 그룹을 나눠주는 기능을 합니다 (값이 같은 중복데이터끼리 같은 그룹으로 묶임)
GROUP BY를 활용해 데이터 중복제거를 할 수 도 있고
주로 집계함수와 함께 사용하여 집계데이터(평균, 최대, 최소, 개수 등)를 구하는 데 사용됩니다

GROUP BY 기본문법

WHERE절 다음에 GROUP BY절 위치합니다
GROUP BY 할 기준 칼럼들을 나열합니다 (다수 칼럼 가능)

SELECT COLUMN1
     , COLUMN2
     , AVG(COLUMN3)
  FROM TABLE
 GROUP BY COLUMN1, COLUMN2
/*
    TABLE내에서 COLUMN1, COLUMN2 칼럼을 기준으로 GROUP BY 합니다
    GROUP BY된 COLUMN1, COLUMN2 데이터가 출력됩니다
    COLUMN1, COLUMN2 그룹 기준으로 COLUMN3의 평균값 출력합니다
*/
GROUP BY 가 포함된 조회문 작성 시 GROUP BY 되지 않은 칼럼은 그냥 조회될 수 없습니다
(그룹화된 칼럼들로 인해 그룹화되지 않은 칼럼은 어느 로우를 조회해야 할지 명확하지 않기 때문)
GROUP BY 되지 않은 칼럼은 그룹함수등을 사용하여 조회해야 합니다

 

예시

예시용 테이블

 NAME  GRADE  CLASS  HEIGHT
 홍길동  1  1  180
 강감찬  1  1  177
 장보고  1  2  172
 임꺽정  1  2  171
 장비  2  1  191
 관우  2  1  197
테이블 이름: STUDENT_INFO
< 칼럼설명 >
NAME: 이름
GRADE: 학년
CLASS: 학급(반)
HEIGHT: 키(신장)

 

GROUP BY로 데이터 중복 제거하기

학급데이터를 중복 없이 조회해 보겠습니다.

SELECT GRADE
     , CLASS
  FROM STUDENT_INFO
 GROUP BY GRADE, CLASS
/*
    STUDENT_INFO 테이블에서 GRADE, CLASS 칼럼을 기준으로 그룹화 하여 출력
*/
 GRADE  CLASS
 1  1
 1  2
 2  1

 

GROUP BY로 집계 데이터 구하기

학급별 평균키를 구해보겠습니다

SELECT CONVER(CHAR(1), GRADE) + '-' + CONVERT(CHAR(1), CLASS) AS GRADE_CLASS
     , AVG(HEIGHT) AS AVG_HEIGHT
  FROM STUDENT_INFO
 GROUP BY GRADE, CLASS
/*
    GRADE, CLASS 데이터를 그룹화하고
    그룹별로 HEIGHT의 평균을 출력
*/
 GRADE_CLASS AVG_HEIGHT
 1-1 178.5
 1-2 171.5
 1-3 194

 

HAVING이란?

HAVING절은 그룹화된 결과에 조건을 거는 데 사용되어  GROUP BY절과 함께 사용됩니다
WHERE절이 행단 위 데이터에 조건을 거는 것처럼
HAVING은 GROUP BY로 그룹화된 데이터에 조건을 거는 용도입니다.

HAVING 기본문법

HAVING절은 GROUP BY 다음줄에 위치합니다

SELECT COLUMN1
     , COLUMN2
     , AVG(COLUMN3) AS AVG_DATA
  FROM TABLE
 GROUP BY COLUMN1, COLUMN2
HAVING COLUMN1 = CONDITION1

/*
    GROUP BY된 COLUMN1 데이터중 CONDITION1 에 해당하는 데이터만 조회합니다.
*/

SELECT COLUMN1
     , COLUMN2
     , AVG(COLUMN3) AS AVG_DATA
  FROM TABLE
 GROUP BY COLUMN1, COLUMN2
HAVING AVG_DATA > CONDITION1

/*
    그룹별 평균값이 CONDITION1 보다 큰 데이터만 조회합니다.
*/

 

예시

HAVING절로 GROUP BY 된 데이터에 조건걸기

SELECT GRADE
     , CLASS
  FROM STUDENT_INFO
 GROUP BY GRADE, CLASS
HAVING GRADE = 1
/*
    STUDENT_INFO 테이블에서 
    GRADE, CLASS 칼럼을 기준으로 그룹화
    그룹화한 데이터중 GRADE 가 1인것만 출력
*/
 GRADE  CLASS
 1  1
 1  2

 

HAVING절로 그룹함수 결과에 조건걸기

SELECT CONVER(CHAR(1), GRADE) + '-' + CONVERT(CHAR(1), CLASS) AS GRADE_CLASS
     , AVG(HEIGHT) AS AVG_HEIGHT
  FROM STUDENT_INFO
 GROUP BY GRADE, CLASS
HAVING AVG(HEIGHT) > 175
/*
    GRADE, CLASS 데이터를 그룹화하고
    그룹별로 HEIGHT의 평균을 출력
    이때 HEIGHT의 평균이 175이상인것만 출력
*/
 GRADE_CLASS  AVG_HEIGHT
 1-1  178.5
 2-1  194

 

GROUP 함수들

GROUP BY와 함께 사용되는 GROUP 함수들은 아래글들에서 자세히 설명하고 있습니다
MSSQL 최대값 구하기 MAX
MSSQL 최소값 구하기 MIN
MSSQL 평균값 구하기 AVG
MSSQL 데이터 개수 구하기 COUNT
MSSQL 합계 구하기 SUM