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 返回的 Recordset。child-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 |