MICROSOFT Access SQL) (GROUP BY 子句

适用于:Access 2013 | Access 2016

将指定字段列表中具有相同值的记录组合成一个记录。 如果在 SELECT 语句中包含 SQL 聚合函数(如 SumCount),则为每条记录创建一个汇总值。

语法

SELECT fieldlist FROM table WHERE criteria [GROUP BY groupfieldlist ]

包含了 GROUP BY 子句的 SELECT 语句具有以下部分:

Part 说明
fieldlist 要检索的字段的名称,以及任何字段名别名、SQL 聚合函数、选择谓词(ALL、DISTINCT、DISTINCTROW 或 TOP)或其他 SELECT 语句选项。
table 要从中检索记录的表的名称。 有关详细信息,请参阅 FROM 子句。
criteria 选择条件。 如果语句包含 WHERE 子句,那么 Microsoft Access 数据库引擎将在向记录应用 WHERE 条件后对值进行分组。
groupfieldlist 最多 10 个用于分组记录的字段的名称。 在 groupfieldlist 中的字段名称的顺序确定了从最高到最低分组级别方法的分组级别。

备注

GROUP BY 是可选的。

如果在 SELECT 语句中没有 SQL 聚合函数,将省略汇总值。

在 GROUP BY 字段中的 Null 值会被分组,不会被忽略。 但是,任何 SQL 聚合函数都不会计算 Null

使用 WHERE 子句排除不希望分组的行,并使用 HAVING 子句在记录分组后筛选记录。

假定 SELECT 语句至少包含一个 SQL 聚合函数,那么,除非 GROUP BY 字段列表中的某个字段包含 Memo 或 OLE 对象数据,否则该字段可以引用 FROM 子句列出的任何表中的任何字段,即使该字段并不包含在 SELECT 语句中。 Microsoft® Jet 数据库引擎不能对 Memo 或 OLE 对象字段进行分组。

在 SELECT 字段列表中的所有字段必须包含于 GROUP BY 子句中,或作为参数包含于 SQL 聚合函数中。

示例

以下示例创建一个列表,列出各项唯一的职务以及担任每项职务的雇员数。 它调用 EnumFields 过程,您可以在 SELECT 语句示例中找到该过程。

Sub GroupByX1() 
 
    Dim dbs As Database, rst As Recordset 
 
    ' Modify this line to include the path to Northwind 
    ' on your computer. 
    Set dbs = OpenDatabase("Northwind.mdb") 
 
    ' For each title, count the number of employees  
    ' with that title.  
    Set rst = dbs.OpenRecordset("SELECT Title, " _ 
        & "Count([Title]) AS Tally " _ 
        & "FROM Employees GROUP BY Title;") 
     
    ' Populate the Recordset. 
    rst.MoveLast 
     
    ' Call EnumFields to print the contents of the  
    ' Recordset. Pass the Recordset object and desired 
    ' field width. 
    EnumFields rst, 25 
 
    dbs.Close 
 
End Sub 

对于每项唯一职务,以下示例计算 Washington 地区担任该项职务的雇员数。

Sub GroupByX2() 
 
    Dim dbs As Database, rst As Recordset 
 
    ' Modify this line to include the path to Northwind 
    ' on your computer. 
    Set dbs = OpenDatabase("Northwind.mdb") 
     
    ' For each title, count the number of employees  
    ' with that title. Only include employees in the  
    ' Washington region. 
    Set rst = dbs.OpenRecordset("SELECT Title, " _ 
        & "Count(Title) AS Tally " _ 
        & "FROM Employees WHERE Region = 'WA' " _ 
        & "GROUP BY Title;") 
     
    ' Populate the Recordset. 
    rst.MoveLast 
 
    ' Call EnumFields to print the contents of the  
    ' Recordset. Pass the Recordset object and desired 
    ' field width. 
    EnumFields rst, 25 
 
    dbs.Close 
 
End Sub 

另请参阅

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。