COMPUTE [BY] 子句用于SELECT查询中,既可查看结果明细,也可查看汇总信息。
COMPUTE 所生成的汇总值在查询结果中显示为单独的结果集。当 COMPUTE 带有可选的 BY 子句时,符合 SELECT 条件的每个组都有两个结果集:
-
每个组的第一个结果集是明细行集,其中包含该组的选择列表信息。
-
每个组的第二个结果集有一行,其中包含该组的 COMPUTE 子句中所指定的聚合函数的小计。
当 COMPUTE 不带可选的 BY 子句时,SELECT 语句有两个结果集:
-
每个组的第一个结果集是包含选择列表信息的所有明细行。
-
第二个结果集有一行,其中包含 COMPUTE 子句中所指定的聚合函数的合计。
例如,Book表中的数据如下:
1. 列出计算机类图书的书号、名称及价格,最后求出册数和总价格。
select 书号, 书名, 定价
from Book
where 类别 = '计算机'
compute count(书号), sum(定价)
查询结果:
2. 列出计算机类图书的书号、名称及价格,并求出各出版社这类书的总价格,最后求出全部册书和总价格。
select 书号, 书名, 定价
from Book
where 类别 = '计算机'
order by 出版社
compute count(书号), sum(定价) by 出版社
compute count(书号), sum(定价)
查询结果:
COMPUTE 和 GROUP BY 之间的区别汇总如下:
-
GROUP BY 生成单个结果集。每个组都有一个只包含分组依据列和显示该组子聚合的聚合函数的行。选择列表只能包含分组依据列和聚合函数。
-
COMPUTE 生成多个结果集。一种结果集包含每个组的明细行,其中包含选择列表中的表达式。另一种结果集包含组的子聚合,或 SELECT 语句的总聚合。选择列表可包含除分组依据列或聚合函数之外的其他表达式。聚合函数在 COMPUTE 子句中指定,而不是在选择列表中指定。
3. 查找这样的图书类别:要求类别中最高的图书定价不低于全部按类别分组的图书的平均定价的倍。
select 类别
from Book
group by 类别
having MAX(定价) > AVG(定价)*2
查询结果
注:COMPUTE [BY]子句只限在SQL Server中使用,并且COMPUTE [BY]在新的SQL Server版本中可能不再支持,因此不推荐使用COMPUTE [BY]。