- rollup 返回单个结果集;compute by 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。
- rollup 可以在服务器游标中使用;compute by 不可以。
- 有时,查询优化器为 rollup 生成的执行计划比为 compute by 生成的更为高效。
用 compute 和 compute by 汇总数据
提供 compute 和 compute by 是为了向后兼容。请改为使用下列组件:
- microsoft® sql server™ 2000 analysis services 和用于 analysis services 的 ole db 或 microsoft activex® 数据对象(多维)(ado md) 一起使用。有关更多信息,请参见 microsoft sql server™ 2000 analysis services。
compute by 子句使您得以用同一 select 语句既查看明细行,又查看汇总行。可以计算子组的汇总值,也可以计算整个结果集的汇总值。
compute 子句需要下列信息:
- 可选的 by 关键字,该关键字可按对一列计算指定的行聚合。
- 行聚合函数名称;例如,sum、avg、min、max 或 count。
- 要对其执行行聚合函数的列。
compute 生成的结果集
compute 所生成的汇总值在查询结果中显示为分离的结果集。包括 compute 子句的查询的结果类似于控制中断报表,即汇总值由指定的组(或称中断)控制的报表。可以为各组生成汇总值,也可以对同一组计算多个聚合函数。
当 compute 带有可选的 by 子句时,符合 select 条件的每个组都有两个结果集:
- 每个组的第一个结果集是明细行集,其中包含该组的选择列表信息。
- 每个组的第二个结果集有一行,其中包含该组的 compute 子句中所指定的聚合函数的小计。
当 compute 不带可选的 by 子句时,select 语句有两个结果集:
- 每个组的第一个结果集是包含选择列表信息的所有明细行。
- 第二个结果集有一行,其中包含 compute 子句中所指定的聚合函数的合计。
compute 用法示例
下列 select 语句使用简单 compute 子句生成 titles 表中 price 及 advance 的求和总计:
use pubs
select type, price, advance
from titles
order by type
compute sum(price), sum(advance)
下列查询在 compute 子句中加入可选的 by 关键字,以生成每个组的小计:
use pubs
select type, price, advance
from titles
order by type
compute sum(price), sum(advance) by type
此 select 语句的结果用 12 个结果集返回,六个组中的每个组都有两个结果集。每个组的第一个结果集是一个行集,其中包含选择列表中所请求的信息。每个组的第二个结果集包含 compute 子句中两个 sum 函数的小计。
说明 一些实用工具(如 osql)显示多个小计或合计聚合汇总的方式可能会使用户以为每个小计都是结果集中的单独一行。这是由于该实用工具设置输出格式的方式;小计或合计聚合返回时单独占用一行。其它应用程序(如 sql 查询分析器)将多个聚合设置在同一行。
比较 compute 和 group by
compute 和 group by 之间的区别汇总如下:
- group by 生成单个结果集。每个组都有一个只包含分组依据列和显示该组子聚合的聚合函数的行。选择列表只能包含分组依据列和聚合函数。
- compute 生成多个结果集。一类结果集包含每个组的明细行,其中包含选择列表中的表达式。另一类结果集包含组的子聚合,或 select 语句的总聚合。选择列表可包含除分组依据列或聚合函数之外的其它表达式。聚合函数在 compute 子句中指定,而不是在选择列表中。
下列查询使用 group by 和聚合函数;该查询将返回一个结果集,其中每个组有一行,该行中包含该组的聚合小计:
use pubs
select type, sum(price), sum(advance)
from titles
group by type
说明 在 compute 或 compute by 子句中,不能包含 ntext、text 或 image 数据类型。