12.1.2 

COMPUTE BY子句可以在结果集内生成控制中断和小计,得到更详细的或总的记录。它把数据分成较小的组,然后为每组建立详细记录结果数据集(如SELECT),也可为每组产生总的记录(如GROUP BY)。在COMPUT BY中,定义BY子句不是必要的。如果没有定义BY子句,则认为整个表为一个组,并且只有两个结果数据集产生,一个拥有所有的详细记录,另一个只有一行,即拥有总记录。

语法:

[ COMPUTE
{ { AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM }
( EXPRESSION ) } [ ,...n ]
[BY  EXPRESSION [ ,...n ] ]
]

其中AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM表示可以使用的聚合函数。EXPRESSION表示计算的列名。EXPRESSION必须出现在选择列表中,并且必须被指定为与选择列表中的某个表达式相同。BY EXPRESSION表示在结果集中生成控制中断和小计。

【示例6】在MyCompany数据库中,统计Products表中所有商品的总价值。

完整的设计步骤如下。

(1) 在查询编辑器中输入以下代码:

SELECT ProductName,Amount,price,total
FROM Products
COMPUTE SUM(total)

(2) 执行该语句,查询结果如图12.6所示。


compute stat 和computer incremental有什么区别 compute和compute by的区别_数据库


图12.6 使用COMPUTE语句


通过上面的查询,可以看到最后一行,表中的所有商品的总价值统计为4032730。

【示例7】在MyCompany数据库中,统计Products表中各国商品的总价值,并查询产品的名称、数量、价格,同时求每一国家的商品总价值,并按照国家分组显示查询的结果。

完整的设计步骤如下。

(1) 在查询编辑器中输入以下代码:

SELECT ProductName,Amount,price,total,Country
FROM Products
ORDER BY Country
COMPUTE SUM(total)BY Country

(2) 执行该语句,查询结果如图12.7所示。

compute stat 和computer incremental有什么区别 compute和compute by的区别_字段_02


图12.7 使用COMPUTE BY语句

提示    
(1) 当在COMPUTE中使用BY时,要求在所有组合字段中必须包含ORDER BY语句。

(2) 在COMPUTE子句指定的行聚合函数中,不允许使用DISTINCT关键字。

(3) 由于包含COMPUTE 的语句生成表并且这些表的汇总结果不存储在数据库中,因此在SELECT INTO 语句中不能使用 COMPUTE。因而,任何由 COMPUTE 生成的计算结果都不会出现在用 SELECT INTO 语句创建的新表内。 

【示例8】在MyCompany数据库中,按照国家和出货日期统计Products表中的商品的总价值,并查询产品的名称、数量、价格、各自品种商品的总价值、出货日期和国家,按照国家和出货日期分组,显示查询的结果。

完整的设计步骤如下。

(1) 在查询编辑器中输入以下代码:

SELECT ProductName,Amount,price,total,outday,Country
FROM Products
ORDER BY Country,outday
COMPUTE SUM(total)BY Country,outday

(2) 执行该语句,查询结果如图12.8所示。

compute stat 和computer incremental有什么区别 compute和compute by的区别_数据库_03


图12.8 在聚合函数COMPUTE BY中使用两个组合字段

提示    
COMPUTE BY语句后出现的字段必须是ORDER BY语句后出现的字段的子集,并且COMPUTE BY语句后出现的字段必须和ORDER BY语句后面的字段具有相同的出现顺序,并以相同的表达式开头,中间不能遗漏任何表达式。 

【示例9】完善示例8。

完整的设计步骤如下。

(1) 在查询编辑器中输入以下代码:

SELECT ProductName,Amount,price,total,outday,Country
FROM products
ORDER BY outday,Country
COMPUTE SUM(total)BY Country,outday

(2) 单击【执行】按钮,将出现错误,如图12.9所示。

compute stat 和computer incremental有什么区别 compute和compute by的区别_字段_04


图12.9 COMPUTE BY语句相关字段出现顺序不一样时出现错误

可以看到,因为COMPUTE BY语句后面出现的字段与ORDER BY后面的字段顺序不一样,因此出现了错误。

(3) 下面的语句是可以的:

SELECT ProductName,Amount,price,total,outday,Country
FROM products
ORDER BY Country,outday
COMPUTE SUM(total)BY Country

(4) 因为COMPUTE BY语句后面出现的字段是ORDER BY后面出现的字段的子集,因此可以执行,查询结果如图12.10所示。


compute stat 和computer incremental有什么区别 compute和compute by的区别_聚合函数_05


图12.10 使用COMPUTE BY语句