MSSQL GROUP BY 사용법 및 예제
GROUP BY 절은 Database에서 자료를 추출할 때 특정 열을 그룹화하고 그룹 내에서 집계 함수를 사용해 data를 추출하는데 집계 함수는 SUM, COUNT, AVG, MAX, MIN, STDEV, STRING_GAG 주로 사용하고 합니다.
GROUP BY 문의 기본 구조
집계 함수를 제외한 COLUMN은 SELECT 절하고 GROUP BY 절에 동시에 선언해 줘야 합니다.
1. SELECT: 데이터를 가져오기 위한 COLUMN 선택합니다. 동시에 여러 집계 함수 사용도 가능합니다.
2. FROM: 데이터를 가져올 table 선언합니다.
3. GROUP BY: 그룹화할 COLUMN을 선언합니다.
4. ORDER BY: 기본적으로 GROUP BY 순서와 다르게 할 때 지정합니다.
GROUP BY 절 사용 예제
기본적인 GROUP BY 절.
학급별로 국어 평균 점수를 AVG 함수를 이용하여 출력하는 예제입니다.
-- 202401월 학생의 국어 평균점수 구하는예제.
SELECT classNo
,AVG(korScore) AS korScoreAvg
FROM UserInfoForGroupBy
WHERE scoreyyyymm = '202401'
GROUP BY classNo
order by classNo asc;
그룹 COLUMN을 여러 개 사용하여 GROUP BY 사용.
학생들의 성적을 월별, 학급별 그룹화하여 국어 평균 점수를 AVG 함수를 이용하여 출력하는 예제입니다.
그룹화를 여러 개 지정하면 Data row 수가 증가합니다.
-- 월별, 학급별 과목 국어 평균점수 구하는예제.
SELECT scoreyyyymm
,classNo
,AVG(korScore) AS korScoreAvg
FROM UserInfoForGroupBy
WHERE scoreyyyymm IN ('202401','202402')
GROUP BY classNo ,scoreyyyymm
order by scoreyyyymm ASC, classNo DESC;
집계 함수를 여러 개 사용.
학생들의 성적을 월별, 학급별 그룹화한 후 COUNT, SUM, AVG 함수를 이용하여 전체평균 점수를 구하는 예제입니다.
-- 월별, 학급별 과목합계와 전체 평균점수 구하는예제.
SELECT scoreyyyymm
,classNo
,COUNT(*) AS groupCount
,sum(korScore) AS korScoreSum
,sum(mathScore) AS mathScoreSum
,sum(engScore) AS engScoreSum
,sum(scienceScore) AS scienceScoreSum
,sum(societyScore) AS societyScoreSum
,AVG(korScore + mathScore + engScore + scienceScore + societyScore) / 5 AS ScoreAvg
FROM UserInfoForGroupBy
WHERE scoreyyyymm IN ('202401','202402')
GROUP BY classNo ,scoreyyyymm
order by scoreyyyymm ASC, classNo DESC;
GROUP BY 하고 ORDER BY 동시에 사용.
GROUP BY 절 다음에 ORDER BY 절을 사용할 수 있으며, 그룹 칼럼 및 집계 함수를 사용하여 ORDER BY 절에서 정렬을 지정합니다.
-- ORDER BY 사용하여 최근월부터 표시 해주세요.
SELECT scoreyyyymm
,classNo
,sum(korScore) AS korScoreSum
FROM UserInfoForGroupBy
WHERE scoreyyyymm IN ('202401','202402')
GROUP BY classNo ,scoreyyyymm
order by scoreyyyymm DESC, classNo asc;
GROUP BY 절 HAVING 사용.
집계 함수의 결과를 서브 질의문을 사용하지 않고 조건절에 사용하고 싶은 경우 HAVING 절을 사용합니다.
HAVING 절하고 AVG 할 수를 이용하여 80점 이상은 학급만 출력할 수 있습니다.
-- HAVING 사용 하여 국어 평균점수 80 이상만 출력.
SELECT scoreyyyymm
,classNo
,avg(korScore) AS korScoreSum
FROM UserInfoForGroupBy
WHERE scoreyyyymm IN ('202401','202402')
GROUP BY classNo ,scoreyyyymm
HAVING avg(korScore) > 80;
GROUP BY 절에 STRING_AGG 사용하여 COLUMN 문자열 합치기 방법.
STRING_AGG은 row data를 하나의 column에 문자열 형태로 구분 값을 넣어서 합칠 수 있는 함수입니다.
-- STRING_AGG 사용하여 COLUMN 문자열 합치기 방법
SELECT classNo
,STRING_AGG(studentNm,',') AS studentNm
FROM UserInfoForGroupBy
WHERE scoreyyyymm IN ('202401')
AND classNo IN (1,2)
GROUP BY classNo;
집계함수 설명
MSSQL 지원하는 기본적인 집계함수.
집계 함수 이름 | COMMNET |
COUNT | 지정 그룹에서 COUNT를표시 |
SUM | 지정 그룹에서 합계를 표시. |
AVG | 지정 그룹에서 평균값을 표시. |
MAX | 지정 그룹에서 최대값을 표시. |
MIN | 지정 그룹에서 최소값을 표시. |
STDEV | 지정 그룹에서 표준 편차를 구할때 사용. |
STRING_AGG | 지정 그룹에서 ROW DATA를 문자열로 합치기. |