SQL Server에서 GROUP BY 절은 특정 칼럼을 기준으로 집계 함수를 사용하여 건수(COUNT), 합계(SUM), 평균(AVG) 등 집 계성 데이터를 추출할 때 사용한다. GROUP BY 절에서 기준 칼럼을 여러 개 지정할 수 있으며, HAVING 절을 함께 사용하면 집계 함수를 사용하여 WHERE 절의 조건절처럼 조건을 부여할 수 있다. GROUP BY 절은 중복제거를 할 때도 사용 가능하다. SQL Server에서는 GROUP BY 절을 사용할 경우 그룹 칼럼을 기준으로 자동으로 ORDER BY가 되지만 명시적으로 ORDER BY를 사용하여 쿼리문을 작성하는 것이 좋다.
기본적인 GROUP BY 절 사용법
직업(job) 별로 급여(sal) 총합계를 구하는 예제이다.
GROUP BY 절의 칼럼은 SELECT 절에 존재해야 사용할 수 있다.
SELECT 절에서 집계 함수를 제외한 칼럼을 GROUP BY 절에 기술한다고 생각하면 된다.
SELECT job
, SUM(sal) AS sum_sal
FROM emp
WHERE deptno IN (20, 30)
GROUP BY job
그룹 칼럼을 여러 개 지정하는 방법
그룹 칼럼이 여러 개인 경우 첫 번째 칼럼(deptno)으로 먼저 그룹이 묶이고, 두 번째 칼럼(job)으로 집계가 된다.
SELECT deptno
, job
, SUM(sal) AS sum_sal
FROM emp
WHERE deptno IN (20, 30)
GROUP BY job, deptno
집계 함수를 여러 개 사용하는 방법
SELECT 절에서 집계 함수를 여러 개 사용할 수 있으며, 집계 함수끼리 연산도 가능하다.
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
정렬 (ORDER BY) 하는 방법
GROUP BY 절 하단에 ORDER BY 절을 사용할 수 있으며, GROUP BY 절과 함께 ORDER BY 절을 사용할 경우 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 절에서 조건절 (HAVING) 사용법
급여(sal)의 합계가 5000 보다 큰 직업(job)만 조회하는 예제이다.
집계 함수의 결과를 조건절에 사용하고 싶은 경우 HAVING 절을 사용하면 된다. HAVING 절에 일반 칼럼을 조건으로 부여할 수 있지만, 일반 칼럼은 WHERE 절에서 조건을 부여하는 것이 좋다.
SELECT job
, SUM(sal) AS sum_sal
FROM emp
WHERE deptno IN (20, 30)
GROUP BY job HAVING SUM(sal) > 5000
조건을 여러 개 부여하는 방법
HAVING 절에서 AND 또는 OR 연산자를 사용하여 여러 개의 조건을 부여할 수 있다.
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
GROUP BY 절에서 자주 사용하는 집계 함수
COUNT (건수)
COUNT 함수는 행의 건수를 집계할 때 사용한다.
일반적으로 COUNT(*) 형식으로 사용하며, 칼럼의 값이 NULL인 경우를 제외하는 경우 칼럼명을 인자로 사용한다.
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
SUM (합계), AVG (평균)
SUM 함수는 해당 칼럼의 모든 값을 합산하며, 수치형 칼럼에만 사용할 수 있다.
AVG 함수는 칼럼 값의 평균을 구하며, 칼럼의 값이 NULL인 경우 제외를 하고 연산을 하니 주의해야 한다.
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
MIN (최솟값), MAX (최댓값)
SELECT deptno
, MIN(sal) AS min_sal
, MAX(sal) AS max_sal
FROM emp
WHERE deptno = 30
GROUP BY deptno
STDEV (표준편차), VAR (분산)
SELECT deptno
, STDEV(sal) AS stdev_sal
, VAR(sal) AS var_sal
FROM emp
WHERE deptno = 30
GROUP BY deptno
STRING_AGG (칼럼 문자열 합치기)
SELECT deptno
, STRING_AGG(ename, ',') AS enames
FROM emp
WHERE deptno = 30
GROUP BY deptno
'프로그래밍 언어 > SQL' 카테고리의 다른 글
[SQL] 인덱스 힌트 / 옵티마이저 힌트 사용 방법 (주석, 튜닝) (0) | 2024.08.06 |
---|---|
[SQL] 정규화(Normalization)와 반정규화(De-Normalization) (0) | 2024.07.31 |
[SQL] INSERT 문 사용법 3가지 (데이터 입력) (0) | 2024.07.29 |
[DB] 트랜잭션 (Transaction) 4가지 특성 (0) | 2024.07.15 |
[데이터베이스] 스키마란? 개념 스키마, 내부 스키마, 외부 스키마 (1) | 2024.05.27 |