MSSQL GROUP BY로 데이터 그룹별 합계와 평균 쉽게 구하는 방법
📌 GROUP BY 사용법과 실무 활용 예제를 한 번에 정리
데이터 분석이나 리포트 작성 시, 단순 합계나 평균 계산만으로는 부족할 때가 많습니다.
이럴 때 GROUP BY 절을 사용하면 특정 기준으로 데이터를 묶어 각 그룹별 합계, 평균, 최소값, 최대값 등을 쉽게 구할 수 있습니다.
예를 들어 상품 카테고리별 매출 합계, 부서별 평균 급여, 월별 주문 건수 등 다양한 형태의 그룹별 통계가 가능합니다.
이번 글에서는 MSSQL에서 GROUP BY의 기본 문법부터 실무 활용 사례, 주의사항까지 차근차근 알려드립니다.
특히, GROUP BY는 SUM, AVG, MIN, MAX 같은 집계 함수와 함께 사용할 때 강력한 분석 도구가 됩니다.
하지만 문법을 잘못 사용하면 원하는 결과가 나오지 않거나 오류가 발생할 수 있으므로, 정확한 문법과 규칙을 이해하는 것이 중요합니다.
이 글을 끝까지 읽으면 초보자도 실무에서 바로 활용할 수 있는 GROUP BY 쿼리를 작성할 수 있게 될 것입니다.
📋 목차
🔗 GROUP BY의 기본 개념
GROUP BY 절은 SQL에서 데이터를 특정 컬럼의 값에 따라 묶어 그룹별로 집계 연산을 수행할 수 있게 해주는 구문입니다.
예를 들어 판매 데이터에서 카테고리별 매출 합계를 구하거나, 부서별 평균 급여를 계산할 때 GROUP BY를 사용합니다.
이렇게 하면 데이터를 세부적으로 분류하여 통계와 분석을 보다 효율적으로 진행할 수 있습니다.
GROUP BY는 주로 SUM, AVG, MIN, MAX와 같은 집계 함수와 함께 사용됩니다.
이 조합을 통해 대량의 데이터를 빠르게 집계하고, 각 그룹의 특성을 한눈에 파악할 수 있습니다.
데이터 분석가, 개발자, 경영진 모두 GROUP BY를 통해 의미 있는 비즈니스 인사이트를 얻을 수 있습니다.
💡 GROUP BY의 역할
- 📊같은 값을 가진 행들을 하나의 그룹으로 묶습니다.
- 📈그룹별 합계, 평균, 최소/최대값 등을 구할 수 있습니다.
- 🔍데이터의 세부적인 패턴과 분포를 파악할 수 있습니다.
💎 핵심 포인트:
GROUP BY를 사용할 때 SELECT 절에는 반드시 그룹화 기준 컬럼과 집계 함수로 계산된 컬럼만 포함해야 합니다. 그렇지 않으면 오류가 발생합니다.
🛠️ GROUP BY 기본 문법
MSSQL에서 GROUP BY 절은 SELECT 문에서 집계 함수를 사용할 때 반드시 함께 등장하는 경우가 많습니다.
기본적으로 SELECT 절에서 집계되지 않은 컬럼은 GROUP BY 절에 포함되어야 하며, 이 규칙을 지키지 않으면 실행 오류가 발생합니다.
📄 기본 문법
SELECT 그룹기준컬럼, 집계함수(컬럼명) AS 결과명
FROM 테이블명
GROUP BY 그룹기준컬럼;
이 구문에서 그룹기준컬럼은 데이터를 묶을 기준이 되는 컬럼입니다.
예를 들어 category 컬럼으로 그룹화하면 동일한 category 값을 가진 행들이 하나의 그룹으로 묶입니다.
💡 예제
상품 테이블(products)에서 카테고리별 상품 수를 계산하는 쿼리는 다음과 같습니다.
SELECT category, COUNT(*) AS 상품수
FROM products
GROUP BY category;
💎 핵심 포인트:
GROUP BY는 SELECT 절에 등장하는 컬럼과 반드시 일치해야 합니다. 집계 함수가 적용되지 않은 컬럼은 모두 GROUP BY 절에 포함되어야 하며, 그렇지 않으면 MSSQL에서 오류가 발생합니다.
⚙️ 집계 함수와 함께 사용하는 GROUP BY
GROUP BY 절은 단독으로 사용되기보다 SUM, AVG, MIN, MAX, COUNT 등과 같은 집계 함수와 함께 사용할 때 가장 큰 효과를 발휘합니다.
이 조합을 통해 그룹별 합계, 평균, 최소/최대값, 건수 등을 한 번에 계산할 수 있습니다.
📄 예제 1: 그룹별 합계
판매 테이블(sales)에서 카테고리별 총 매출을 계산하려면 다음과 같이 작성합니다.
SELECT category, SUM(amount) AS 총매출
FROM sales
GROUP BY category;
📄 예제 2: 그룹별 평균
직원 테이블(employees)에서 부서별 평균 급여를 구하려면 다음과 같이 작성합니다.
SELECT department, AVG(salary) AS 평균급여
FROM employees
GROUP BY department;
💎 핵심 포인트:
집계 함수와 GROUP BY를 함께 사용할 때는, 조건에 따라 WHERE 절 또는 HAVING 절을 적절히 사용해 결과를 제한할 수 있습니다. WHERE 절은 그룹화 이전에 필터링, HAVING 절은 그룹화 이후 집계 결과를 필터링하는 데 사용됩니다.
🔌 여러 컬럼을 기준으로 그룹화하기
실무에서는 하나의 기준만으로 그룹화하기보다 두 개 이상 컬럼을 동시에 묶어 통계를 내는 경우가 훨씬 많습니다.
예를 들어 같은 카테고리라도 지역이나 판매 채널에 따라 매출이 달라질 수 있으므로, category + region처럼 복합 기준으로 그룹을 나누면 더 정밀한 분석이 가능합니다.
MSSQL에서 여러 컬럼을 기준으로 그룹화하려면 GROUP BY 절에 컬럼을 쉼표로 나열하면 됩니다.
이때 SELECT 절에는 집계되지 않은 모든 컬럼이 GROUP BY 목록에 포함되어야 하며, 포함되지 않으면 오류가 발생합니다.
📄 기본 문법
SELECT 컬럼A, 컬럼B, 집계함수(값컬럼) AS 결과명
FROM 테이블명
GROUP BY 컬럼A, 컬럼B;
위 구문에서 컬럼A, 컬럼B는 복합 그룹의 키가 됩니다.
두 컬럼 값이 모두 동일한 행끼리 하나의 그룹으로 묶이며, 그 그룹에 대해 합계·평균 등 집계함수가 계산됩니다.
💡 예제 1: 카테고리+지역별 매출 합계
판매 테이블(sales)에서 카테고리와 지역을 함께 묶어 총 매출을 계산합니다.
SELECT category, region, SUM(amount) AS 총매출
FROM sales
GROUP BY category, region
ORDER BY category, region;
정렬을 위해 ORDER BY에 동일한 키를 지정하면, 결과를 읽기 쉽게 정렬된 형태로 확인할 수 있습니다.
📊 예제 2: 연도+월 기준으로 묶기
날짜 컬럼을 변환해 연-월 단위로 그룹화하는 예시입니다.
보고서에서 월별 추세를 보려면 자주 사용합니다.
SELECT YEAR(order_date) AS 연도,
MONTH(order_date) AS 월,
COUNT(*) AS 주문건수,
SUM(amount) AS 매출합계
FROM orders
GROUP BY YEAR(order_date), MONTH(order_date)
ORDER BY 연도, 월;
✅ 실무 체크리스트
- 🧩SELECT에 있는 비집계 컬럼은 모두 GROUP BY에 포함하기.
- 🧮날짜는 YEAR, MONTH 등으로 변환해 원하는 기간 단위로 그룹화.
- 🧹문자열 기준은 TRIM/UPPER 등 전처리로 불필요한 공백·대소문자 차이를 제거.
- 🚩NULL은 동일 그룹으로 묶이므로, 필요 시 COALESCE(컬럼, ‘기타’)로 레이블링.
⚠️ 주의사항
⚠️ 표현식 그룹화 YEAR(order_date)처럼 표현식을 SELECT에 사용했다면 GROUP BY에도 동일한 표현식을 포함해야 합니다.
다른 컬럼이나 별칭만 넣으면 오류가 발생합니다.
또한 다중 컬럼 그룹화는 키 조합 수가 늘어나므로 결과 행이 급격히 증가할 수 있습니다.
필요 시 WHERE/HAVING로 범위를 제한해 성능과 가독성을 함께 확보하세요.
💡 HAVING 절로 그룹 조건 필터링
그룹화 결과에 조건을 걸어야 할 때는 HAVING 절을 사용합니다.
WHERE는 그룹화 이전의 원본 행을 거르고, HAVING은 GROUP BY로 묶인 이후의 집계 결과에 조건을 적용합니다.
예를 들어 카테고리별 총매출이 특정 금액 이상인 그룹만 보고 싶거나, 부서별 평균 급여가 일정 기준을 넘는 경우만 추려낼 때 HAVING이 필요합니다.
📄 기본 문법과 사용 위치
SELECT 그룹컬럼, 집계함수(값컬럼) AS 결과명
FROM 테이블명
WHERE 원본행_필터 -- 그룹화 이전 필터
GROUP BY 그룹컬럼
HAVING 집계함수(값컬럼) 조건식 -- 그룹화 이후 필터
ORDER BY 정렬기준;
성능과 정확도를 위해 가능하면 WHERE로 먼저 데이터 범위를 축소하고, 최종 집계 결과에 대한 기준은 HAVING으로 제한하는 패턴이 권장됩니다.
💰 예제 1: 카테고리별 총매출 100만 이상만
SELECT category, SUM(amount) AS 총매출
FROM sales
WHERE sale_date >= '2025-01-01' -- 기간 사전 필터링
GROUP BY category
HAVING SUM(amount) >= 1000000 -- 집계 결과 조건
ORDER BY 총매출 DESC;
👥 예제 2: 부서별 평균 급여 상위 선별
SELECT department, AVG(salary) AS 평균급여, COUNT(*) AS 인원
FROM employees
WHERE active = 1
GROUP BY department
HAVING AVG(salary) >= 6000000 AND COUNT(*) >= 5
ORDER BY 평균급여 DESC;
🧩 예제 3: 비율·조건부 합계 필터링
CASE 표현식과 결합하면 성공률, 반품률처럼 비율 기반 기준으로도 필터링할 수 있습니다.
SELECT category,
SUM(CASE WHEN returned = 1 THEN 1 ELSE 0 END) AS 반품건수,
COUNT(*) AS 주문건수
FROM sales
GROUP BY category
HAVING (1.0 * SUM(CASE WHEN returned = 1 THEN 1 ELSE 0 END) / NULLIF(COUNT(*), 0)) <= 0.05;
💎 핵심 포인트:
HAVING에서는 같은 SELECT 문에서 정의한 집계 열의 별칭을 대부분 재사용할 수 없습니다. 안전하게 집계 함수 식 자체를 HAVING에 반복해 작성하세요.
⚠️ 주의사항
⚠️ WHERE와 HAVING 혼용 불필요한 행까지 그룹화하면 비용이 커집니다. 사전 필터는 WHERE, 집계 기준은 HAVING으로 나눠 성능을 확보하세요.
또한 NULL 분모가 생길 수 있는 비율 계산은 NULLIF로 0 나누기 오류를 방지하세요.
❓ 자주 묻는 질문 (FAQ)
GROUP BY와 DISTINCT의 차이는 무엇인가요?
집계 결과가 필요하면 GROUP BY, 단순 중복 제거면 DISTINCT가 적합합니다.
WHERE와 HAVING은 언제 각각 사용하나요?
성능상 WHERE로 먼저 범위를 줄이고 HAVING으로 최종 조건을 거는 것이 좋습니다.
HAVING 절에서 집계 열의 별칭을 사용할 수 있나요?
안전하게 같은 집계 식을 반복해서 작성하세요. 예: HAVING SUM(amount) >= 1000000
여러 컬럼으로 동시에 그룹화할 수 있나요?
SELECT에 있는 비집계 컬럼은 모두 GROUP BY 목록에 포함되어야 오류가 나지 않습니다.
NULL 값은 그룹화 시 어떻게 처리되나요?
레이블을 붙이려면 COALESCE(컬럼, ‘기타’)처럼 대체 값을 사용하면 가독성이 좋아집니다.
표현식이나 함수 결과로도 GROUP BY가 가능한가요?
이때 SELECT에 사용한 표현식과 GROUP BY의 표현식이 동일해야 합니다(별칭만 쓰면 오류).
ROLLUP, CUBE, GROUPING SETS는 무엇이며 언제 쓰나요?
ROLLUP은 누계/소계, CUBE는 모든 조합, GROUPING SETS는 선택한 조합만 요약할 때 사용합니다.
대시보드용 총계와 소계를 한 쿼리로 얻을 때 유용합니다.
GROUP BY 대신 윈도 함수(OVER)를 쓰면 무엇이 다른가요?
반면 GROUP BY는 행을 그룹 단위로 축약합니다.
요약표가 필요하면 GROUP BY, 행 단위에 통계를 표시하려면 윈도 함수를 사용합니다.
📌 GROUP BY로 그룹별 통계 한 번에 끝내기
MSSQL의 GROUP BY는 같은 값끼리 행을 묶어 그룹별 합계, 평균, 최소·최대, 건수 등 핵심 지표를 계산하는 데 쓰입니다.
SUM, AVG, MIN, MAX, COUNT와 결합하면 카테고리·지역·기간 등 다양한 기준으로 통계를 만들 수 있습니다.
복수 컬럼 그룹화와 표현식(YEAR, MONTH)도 지원하며, 결과 조건은 HAVING으로 필터링합니다.
SELECT의 비집계 컬럼을 GROUP BY에 모두 포함하고, WHERE로 사전 필터링하여 성능을 확보하면 실무 보고서 품질이 크게 개선됩니다.
🏷️ 관련 태그 : MSSQL, GROUP BY, HAVING, SQL 집계 함수, SUM, AVG, MIN, MAX, COUNT, 데이터 분석