探讨SQL compute by的使用分析


  本文标签:SQL,compute,by

GROUP BY子句有个缺点,就是返回的结果集中只有合计数据,而没有原始的详细记录 。如果想在SQL SERVER中完成这项工作,可以使用COMPUTE BY子句 。COMPTE生成合计作为附加的汇总列出现在结果集的最后 。当与BY一起使用时,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 函数的小计 。

compute by 子句的规则:

(1)不能将distinct与行统计函数一起使用

(2)compute ??? by 子句中 ???出的列必须出现在选择列表中

(3)不能在含有compute by 子句的语句中使用select into 子句,因为包括compute 子句的语句会产生不规则的行 。

(4)如果使用了compute by子句,则必须使用order by 子句, 而且compute by子句中的列必须包含在order by 子句中,并且对列的前后顺序和起始项都要一致(说白了compute by子句中的列必须是order by子句中列表的全部,或者前边的连续几个) 。

(5)如果compute 省略了 by ,则order by 也可以省略

(6)如果compute by 子句包含多列时,会将一个组(第一个列分的组)分成若干个子组(利用后面的列),并对每层子组进行统计 。

(7)使用多个compute by子句时,会分别按不同的组统计出结果 。详细信息还是按照正常的第一个分组方式显示 。

(8)compute by 子句中可以使用多个统计函数,他们互不影响

(9)compute by 子句中可以不包含by ,而只用compute  此时不对前面信息分组,而只对全部信息进行统计 。

比较 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 数据类型 。