GROUP BY절을 사용하여 개별 행이 아닌 행 그룹의 특성을 찾을 수 있습니다.
GROUP BY절을 지정할 때 SQL은 각 그룹의 행이 하나 이상의 열 또는 표현식에서 일치하는 값을 갖도록 선택된 행을 그룹으로 나눕니다. 다음으로, SQL은 각각의 그룹을 처리하여 그룹에 대한 단일 행 결과를 생성합니다. GROUP BY절에서 하나 이상의 열 또는 표현식을 지정하여 행을 그룹화할 수 있습니다. SELECT문에서 지정하는 항목은 테이블 또는 뷰의 개별 행 등록정보가 아니라 각 행 그룹의 등록정보입니다.
GROUP BY절이 없는 경우 SQL 총계 함수의 애플리케이션은 하나의 행을 리턴합니다. GROUP BY가 사용될 때, 함수는 각 그룹에 적용되므로 그룹이 있는 만큼 행을 리턴합니다.
예를 들어, CORPDATA.EMPLOYEE 테이블에 몇 개의 행 세트가 있고 각 세트가 특정 부서의 멤버를 설명하는 행으로 구성됩니다. 각 부서에 있는 직원의 평균 급여를 찾으려면 다음을 발행합니다.
SELECT WORKDEPT, DECIMAL (AVG(SALARY),5,0)
FROM CORPDATA.EMPLOYEE
GROUP BY WORKDEPT
결과는 몇 개의 행(각 부서마다 하나씩)입니다.
| WORKDEPT | AVG-SALARY |
|---|---|
| A00 | 40850 |
| B01 | 41250 |
| C01 | 29722 |
| D11 | 25147 |
| D21 | 25668 |
| E01 | 40175 |
| E11 | 21020 |
| E21 | 24086 |
GROUP BY를 사용할 때 SQL이 행 그룹화에 사용하도록 할 열 또는 표현식을 나열합니다. 예를 들어, CORPDATA.PROJECT 테이블에 설명된 각 주요 프로젝트에 대해 작업하는 직원의 번호를 나열하려고 합니다. 다음을 발행할 수 있습니다.
SELECT SUM(PRSTAFF), MAJPROJ
FROM CORPDATA.PROJECT
GROUP BY MAJPROJ
결과는 회사의 현재 주요 프로젝트와 각 프로젝트에 대해 작업하는 직원의 번호 리스트입니다.
| SUM(PRSTAFF) | MAJPROJ |
|---|---|
| 6 | AD3100 |
| 5 | AD3110 |
| 10 | MA2100 |
| 8 | MA2110 |
| 5 | OP1000 |
| 4 | OP2000 |
| 3 | OP2010 |
| 32.5 | ? |
또한 행이 두 개 이상의 열 또는 표현식에 의해 그룹화되도록 할 것을 지정할 수도 있습니다. 예를 들어, CORPDATA.EMPLOYEE 테이블을 사용하여 각 부서에 있는 여직원과 남직원의 평균 급여를 찾기 위한 select문을 발행할 수 있습니다. 이와 같이 하려면 다음 명령문을 발행하십시오.
SELECT WORKDEPT, SEX, DECIMAL(AVG(SALARY),5,0) AS AVG_WAGES
FROM CORPDATA.EMPLOYEE
GROUP BY WORKDEPT, SEX
결과는 다음과 같습니다.
| WORKDEPT | SEX | AVG_WAGES |
|---|---|---|
| A00 | F | 49625 |
| A00 | M | 35000 |
| B01 | M | 41250 |
| C01 | F | 29722 |
| D11 | F | 25817 |
| D11 | M | 24764 |
| D21 | F | 26933 |
| D21 | M | 24720 |
| E01 | M | 40175 |
| E11 | F | 22810 |
| E11 | M | 16545 |
| E21 | F | 25370 |
| E21 | M | 23830 |
이 예제에 WHERE절을 포함하지 않았으므로, SQL은 CORPDATA.EMPLOYEE 테이블에 있는 모든 행을 조사하여 처리합니다. SQL이 각 그룹의 평균 SALARY 값을 파생하기 전에 행은 우선 부서 번호 기준으로 그룹화되고 다음으로 (각 부서에서) 성별 기준으로 그룹화됩니다.