Shape Compute 子句

适用于:Access 2013、Office 2013

shape COMPUTE 子句可以生成父 Recordset,该记录集的列由以下项组成:对子 Recordset 的引用;其内容为章节列、新列或计算列的可选列,或者是对子 Recordset 或以前定形的 Recordset 执行聚合函数的结果;以及在可选的 BY 子句中列出的子 Recordset 中的任何列。

语法

 
SHAPE child-command [AS] child-alias 
   COMPUTE child-alias [[AS] name], [appended-column-list] 
   [BY grp-field-list] 

说明

此子句的各部分如下所示:

  • child-command

    • 由下列各项之一组成:

      • 大括号中的查询命令 (“{}”) 返回一个子 Recordset 对象。 该命令向基础数据提供程序发出,其语法取决于该提供程序的要求。 这通常是 SQL 语言,但 ADO 不需要任何特定的查询语言。

      • 现有已构形 Recordset 的名称。

      • 另一个 Shape 命令。

      • TABLE 关键字,后跟数据提供程序中的表的名称。

  • child-alias

    • 别名,用于引用由 child-command 返回的 Recordsetchild-alias 在 COMPUTE 子句的列的列表中是必需的,它定义了父和子 Recordset 对象之间的关系。
  • appended-column-list

    • 列表,其中的每个元素定义了所生成的父记录集中的列。 每个元素都包含章节列、新列、计算列或对子 Recordset 执行聚合函数得到的值。
  • grp-field-list

    • 父和子 Recordset 对象中列的列表,用于指定在子记录集中应当如何对行进行分组。 对于 grp-field-list 中的每个列,在子和父 Recordset 对象中都有相应的列。 对于父 Recordset 中的每个行,grp-field-list 列都有唯一的值,父行所引用的子 Recordset 仅由其 grp-field-list 列与父行具有相同值的子行组成。

如果包含 BY 子句,将基于 COMPUTE 子句中的列对子 Recordset 的行进行分组。 对于子 Recordset 中的每一组行,父 Recordset 将相应包含一行。

如果省略 BY 子句,则会将整个子 Recordset 视为单个组,并且父 Recordset 将只包含一行。 该行将引用整个子 Recordset。 通过省略 BY 子句,可以对整个子 Recordset 计算“总计”聚合。

例如:

    SHAPE {select * from Orders} AS orders
       COMPUTE orders, SUM(orders.OrderAmount) as TotalSales

不管采用什么方式形成父 Recordset (使用 COMPUTE 或使用 APPEND),它都将包含用来将它与子 Recordset 相关的章节列。 如果愿意,父 Recordset 所包含的列还可能包含针对子行的聚合(SUM、MIN、MAX 等)。 父和子 Recordset 所包含的列都可能包含针对 Recordset 中的行的表达式,以及最初为空的新列。

操作

child-command 向提供程序发出,提供程序则返回子 Recordset

COMPUTE 子句指定父 Recordset 的列,而父记录集则可能是以下项:对子 Recordset 的引用、一个或多个聚合、计算表达式或新列。 如果有 BY 子句,则它定义的列也将追加到父 Recordset 中。 BY 子句指定如何对子 Recordset 的行进行分组。

例如,假设有一个表 Demographics(人口统计)是由 State(省/市/自治区)、City(市/县)和 Population(人口)字段组成的(人口数字仅用于举例说明)。

状态

城市

人口

华盛顿州

西雅图

700,000 项

OR

梅德福

200,000

OR

波特兰

400,000

加利福尼亚州

Los Angeles

800,000

加利福尼亚州

San Diego

600,000

华盛顿州

塔科马

500,000

OR

Corvallis

300,000

现在,发出以下 Shape 命令:

 
rst.Open  "SHAPE {select * from demographics} AS rs "  & _ 
          "COMPUTE rs, SUM(rs.population) BY state", _ 
           objConnection 

此命令将打开一个具有两个级别的已构形 Recordset 。 父级别是生成的 Recordset ,其中包含一个聚合列 (SUM (rs.population) ) ,一个引用子 Recordset (rs ) 的列,以及一个用于将子 Recordset (状态 ) 分组的列。 子级别是查询命令 () 返回的 Recordset 、引用子 Recordset (rs ) 的列,以及用于将子 Recordset (状态 ) 分组的列。 子级别是查询命令返回的 Recordset , (从人口统计 ) 中选择 *。

Recordset 明细行将按省/市/自治区进行分组,但在其他情况下并没有特定的顺序。 就是说,组将不以字母或数字顺序分组。 如果希望对父 Recordset 进行排序,可以使用 RecordsetSort 方法对父 Recordset 进行排序。

现在可以在打开的父 Recordset 中导航,并访问子明细 Recordset 对象。 有关详细信息,请参阅访问分层记录集中的行

结果父和子明细记录集

Parent

SUM (rs.Population)

Rs

状态

1,300,000

引用 child1

加利福尼亚州

1,200,000

引用 child2

华盛顿州

1,100,000

引用 child3

OR

Child1

状态

城市

人口

加利福尼亚州

Los Angeles

800,000

加利福尼亚州

San Diego

600,000

Child2

状态

城市

人口

华盛顿州

西雅图

700,000 项

华盛顿州

塔科马

500,000

Child3

状态

城市

人口

OR

梅德福

200,000

OR

波特兰

400,000

OR

Corvallis

300,000