Shape COMPUTE 子句

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 返回的 Recordset 的别名。child-alias 在 COMPUTE 子句的列列表中是必需的,它定义父 Recordset 对象和子 Recordset 对象之间的关系。

appended-column-list
一个列表,其中每个元素定义生成的父级中的一列。 每个元素都包含一个章节列、新列、计算列或由子 Recordset 上的聚合函数生成的值。

grp-field-list
父和子 Recordset 对象中的列列表,该列表指定应如何在子级中对行进行分组。

对于 grp-field-list 中的每个列,子 Recordset 对象和父 Recordset 对象中都有一个相应的列。 对于父 Recordset 中的每个行,grp-field-list 列具有唯一值,父行引用的子 Recordset 仅包含其 grp-field-list 列与父行具有相同值的子行。

如果包含 BY 子句,子 Recordset 的行将根据 COMPUTE 子句中的列进行分组。 父 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 的列都可以包含 Recordset 中针对行的表达式,也可以是最初为空的新列。

操作

child-command 将发送到提供程序,提供程序返回子 Recordset。

COMPUTE 子句指定父 Recordset 的列,该列可能是对子 Recordset、一个或多个聚合、计算表达式或新列的引用。 如果有 BY 子句,则它定义的列也会追加到父 Recordset。 BY 子句指定了如何对子 Recordset 的行进行分组。

例如,假设有一个名为“Demographics”的表,该表由“State”、“City”和“Population”字段组成。 (表中的人口数字仅作为示例提供)。

状态 City 人口数
WA Seattle 700,000
OR Medford 200,000
OR Portland 400,000
CA Los Angeles 800,000
CA San Diego 600,000
WA Tacoma 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 进行分组的列 (state)。 子级别是查询命令 (select * from demographics) 返回的 Recordset。

子 Recordset 详细信息行将按 state 分组,但其他方面没有特定的顺序。 也就是说,这些组不会按字母顺序或数字顺序排列。 如果要对父 Recordset 进行排序,可以使用 Recordset Sort 方法对父 Recordset 进行排序。

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

生成的父级和子级详细信息 Recordset

Parent

SUM (rs.Population) rs 状态
1,300,000 对 child1 的引用 CA
1,200,000 对 child2 的引用 WA
1,100,000 对 child3 的引用 OR

Child1

状态 City 人口数
CA Los Angeles 800,000
CA San Diego 600,000

Child2

状态 City 人口数
WA Seattle 700,000
WA Tacoma 500,000

Child3

状态 City 人口数
OR Medford 200,000
OR Portland 400,000
OR Corvallis 300,000

另请参阅

访问分层记录集中的行
数据整理概述
字段对象
正式 Shape 语法
记录集对象 (ADO)
数据整理所需的提供程序
Shape APPEND 子句
常用 Shape 命令
Value 属性 (ADO)
Visual Basic for Applications 函数