GROUP BY子句有个缺点,就是返回的结果集中只有合计数据,而没有原始的详细记录。如果想在SQL SERVER中完成这项工作,可以使用COMPUTE BY子句。COMPTE生成合计作为附加的汇总列出现在结果集的最后。当与BY一起使用时,COMPUTE 子句在结果集内生成控制中断和分类汇总。
1 不能将distinct与行统计函数一起使用
2 compute by 中列出的列必须出现在选择列表中
3 不能在含有compute by 子句的语句中使用select into 子句,因为包括compute 子句的语句会产生不规则的行。
4 compute 用了 by子句,则必须使用order by , 且compute by中的列必须是order by列表的全部,或者前边的连续几个。
5 compute 省略了 by ,则order by 也可以省略。
6 compute by 子句包含多列时,会将一个组(第一个列分的组)分成若干个子组(利用后面的列),并对每层子组进行统计。
7 compute by 子句中可以使用多个统计函数,他们互不影响。
8 compute 不包含by 时不对前面信息分组,而只对全部信息进行统计。
9 COMPUTE 所生成的汇总值在查询结果中显示为单独的结果集。
COMPUTE 生成的结果集
当 COMPUTE 带 BY 子句时,符合 SELECT 条件的每个组都有两个结果集:
当 COMPUTE 带 BY 子句时,符合 SELECT 条件的每个组都有两个结果集:
每个组的第一个结果集是明细行集,其中包含该组的选择列表信息。
每个组的第二个结果集有一行,其中包含该组的 COMPUTE 子句中所指定的聚合函数的小计。
当 COMPUTE 不带 BY 子句时,SELECT 语句有两个结果集:
每个组的第二个结果集有一行,其中包含该组的 COMPUTE 子句中所指定的聚合函数的小计。
当 COMPUTE 不带 BY 子句时,SELECT 语句有两个结果集:
每个组的第一个结果集是包含选择列表信息的所有明细行。
第二个结果集有一行,其中包含 COMPUTE 子句中所指定的聚合函数的合计。
COMPUTE 和 GROUP BY比较
COMPUTE 和 GROUP BY 区别:
第二个结果集有一行,其中包含 COMPUTE 子句中所指定的聚合函数的合计。
COMPUTE 和 GROUP BY比较
COMPUTE 和 GROUP BY 区别:
GROUP BY 生成单个结果集。每个组都有一个只包含分组依据列和显示该组子聚合的聚合函数的行。选择列表只能包含分组依据列和聚合函数。
COMPUTE 生成多个结果集。一种结果集包含每个组的明细行,其中包含选择列表中的表达式。
COMPUTE 生成多个结果集。一种结果集包含每个组的明细行,其中包含选择列表中的表达式。
例子:
原始表:
部门 员工 工资 年龄
A ZHANG 100 20
A LI 200 21
A WANG 300 22
A ZHAO 400 23
B DUAN 500 24
B DUAN 600 25
A
A
A
B
B
1.GROUP BY
SELECT 部门,员工,SUM(工资)AS TOTAL,avg(年龄)as年龄
FROM PERSON
GROUP BY 部门,员工
FROM PERSON
GROUP BY 部门,员工
结果:
部门 员工 工资 年龄
B DUAN 1100 24
A LI 200 21
A WANG 300 22
A ZHANG 100 20
A ZHAO 400 23
A
A
A
A
2.COMPUTE
SELECT 部门,员工,工资,年龄
FROM PERSON
ORDER BY 部门,员工
COMPUTE SUM(工资) ,avg(年龄)
FROM PERSON
ORDER BY 部门,员工
COMPUTE
结果:
部门 员工 工资 年龄
A LI 200 21
A WANG 300 22
A ZHANG 100 20
A ZHAO 400 23
B DUAN 500 24
B DUAN 600 25
A
A
A
B
B
sum avg
2100 22
(3)COMPUTE BY
SELECT 部门,员工,工资,年龄
FROM PERSON
ORDER BY 部门,员工
COMPUTE SUM(工资) ,avg(年龄) by 部门
FROM PERSON
ORDER BY 部门,员工
COMPUTE
结果
部门 员工 工资 年龄
A LI 200 21
A WANG 300 22
A ZHANG 100 20
A ZHAO 400 23
A
A
A
sum avg
1000 21
部门 员工 工资 年龄
B DUAN 500 24
B DUAN 600 25
B
sum avg
1100 24