GROUP BY子句

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 平均工资
A00 40850
B01 41250
C01 29722
D11 25147
D21 25668
E01 40175
E11 21020
E21 24086
注:
  1. 对行进行分组并不意味着对行进行排序。 分组将每个选定行放入一个组中,然后 SQL 将处理该组的特征。 对行进行排序会将结果表中的所有行按升序或降序整理顺序放置。 根据数据库管理器选择的实现,可能会对生成的组进行排序。
  2. 如果在 GROUP BY 子句中指定的列中存在空值,那么将为具有空值的行中的数据生成单行结果。
  3. 如果分组发生在字符或 UCS-2 或 UTF-16 图形列上,那么运行查询时生效的排序顺序将应用于分组。

使用 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 WORKDEPT, SEX, DECIMAL(AVG(SALARY),5,0) AS AVG_WAGES
       FROM CORPDATA.EMPLOYEE
       GROUP BY WORKDEPT, SEX;

结果如下。

WORKDEPT SEX 平均工资
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 值之前,首先按部门编号对行进行分组,然后按性别对行进行分组 (在每个部门内)。