汇总数据操作符:
compute:使用聚合函数生成数据的汇总值.详细信息及所有行的总值.
compute by:后面加by不会生成一个总的汇总值.而是详细信息及每一类别的汇总值.
with rollup:可以创建 group by 子句元素内元素的汇总与分类汇总.
with cube:可以创建 group by子句中列表的所有可能的分组组合,生成超聚合行.
COPY了SQL 联机帮助里的一段:
-----------------------
ROLLUP 操作的结果集具有类似于 COMPUTE BY 所返回结果集的功能;然而,ROLLUP 具有下列优点:
ROLLUP 返回单个结果集;COMPUTE BY 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。
ROLLUP 可以在服务器游标中使用;COMPUTE BY 不可以。
有时,查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE BY 生成的更为高效
-------------------------
下面就是针对上面四个操作符的例子.首先把group by分组列出来对比:
use tsie
go
select * from syscolumns where id=object_id(N'OMaster')
--------------------------------
--group by:显示信息为每个销售单负责者每月每项物料的欠量量;
SELECT CONMer,datepart(MM,Curdate)as curMonth,PartNum,sum(DQty)
FROM SMaster s,OMaster o
where s.OrderNum=o.OrderNum
and Curdate<getdate()
and PartNum like '1-6-1%'
group by CONMer,datepart(MM,Curdate),PartNum
order by CONMer,datepart(MM,Curdate)
/*
CONMer curMonth PartNum
------------------------------ ----------- --------------- ---------------------
9 1-6-141 50000.0
FM 8 1-6-145 10000.0
FM 9 1-6-141 50000.0
FM 9 1-6-145 12850.0
JH 7 1-6-145 0.0
JH 8 1-6-141 8500.0
JH 8 1-6-145 21200.0
(所影响的行数为 7 行)
*/
--------------------------------
--compute by: 分类分组显示:具有详细信息,也会在每一组后给个汇总值.注意Compute by 后的列必须出现在语句的选择列中以及order by中,并且按顺序(order by中的)出现.否则将出现如下信息:
/*
服务器: 消息 163,级别 15,状态 1,行 7
计算依据列表与排序依据列表不匹配。
*/
SELECT CONMer,datepart(MM,Curdate)as curMonth,PartNum,DQty
FROM SMaster s,OMaster o
where s.OrderNum=o.OrderNum
and Curdate<getdate()
and PartNum like '1-6-1%'
order by CONMer,datepart(MM,Curdate),PartNum
compute sum(DQty) by CONMer,datepart(MM,Curdate),PartNum
--------------------------------
/*
CONMer curMonth PartNum DQty
------------------------------ ----------- --------------- -------------------------------
9 1-6-141 50000.0
sum
===================================
50000.0
CONMer curMonth PartNum DQty
------------------------------ ----------- --------------- -----------------------------------------------------
FM 8 1-6-145 10000.0
sum
==================================
10000.0
CONMer&n