数据汇总

汇总数据操作符:
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              curMonth    PartNum     DQty                                           
------------------------------ ----------- --------------- -----------------------------
FM                             9           1-6-141         50000.0

                                                           sum
                                                           =================================
                                                           50000.0


CONMer              curMonth    PartNum     DQty                                         
------------------------------ ----------- --------------- ----------------------
FM                             9           1-6-145         3250.0
FM                             9           1-6-145         5400.0
FM                             9           1-6-145         4200.0

                                                           sum
                                                           ==============================
                                                           12850.0


CONMer              curMonth    PartNum     DQty                                           
------------------------------ ----------- --------------- ----------------------------
JH                             7           1-6-145         0.0
JH                             7           1-6-145         0.0

                                                           sum
                                                           ==============================
                                                           0.0


CONMer              curMonth    PartNum     DQty                                           
------------------------------ ----------- --------------- -------------------------
JH                             8           1-6-141         8500.0

                                                           sum
                                                           ==============================
                                                           8500.0


CONMer              curMonth    PartNum     DQty                                          
------------------------------ ----------- --------------- -------------------------------
JH                             8           1-6-145         3200.0
JH                             8           1-6-145         18000.0
JH                             8           1-6-145         0.0

                                                           sum
                                                           ================================
                                                           21200.0


(所影响的行数为 19 行)
*/
--------------------------------
--compute:
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)

--------------------------------
/*
CONMer              curMonth    PartNum     DQty                                             
------------------------------ ----------- --------------- -----------------------
                               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         3250.0
FM                             9           1-6-145         5400.0
FM                             9           1-6-145         4200.0
JH                             7           1-6-145         0.0
JH                             7           1-6-145         0.0
JH                             8           1-6-141         8500.0
JH                             8           1-6-145         3200.0
JH                             8           1-6-145         18000.0
JH                             8           1-6-145         0.0

                                                           sum
                                                           ===============================
                                                           152550.0           

(所影响的行数为 13 行)

*/
--------------------------------
---rollup:给每一个Group by分组进行汇总.
use tsie
go
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 with rollup

--------------------------------
/*
CONMer              curMonth    PartNum     DQty                                                                 
------------------------------ ----------- --------------- -------------------------- 
                               9           1-6-141         50000.0           

                                    9           NULL            50000.0                          

                              NULL        NULL            50000.0          
FM                             8           1-6-145         10000.0          
FM                             8           NULL            10000.0
FM                             9           1-6-141         50000.0
FM                             9           1-6-145         12850.0
FM                             9           NULL            62850.0
FM                             NULL        NULL            72850.0
JH                             7           1-6-145         0.0
JH                             7           NULL            0.0
JH                             8           1-6-141         8500.0
JH                             8           1-6-145         21200.0
JH                             8           NULL            29700.0
JH                             NULL        NULL            29700.0
NULL                           NULL        NULL            152550.0           --所有CONMer的欠量汇总

(所影响的行数为 16 行)
*/
--------------------------------
--cube:所有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 with cube
--------------------------------

/*
CONMer                      curMonth    PartNum                                                            
------------------------------ ----------- --------------- ---------------------------------
                               9           1-6-141         50000.0     

                              9           NULL            50000.0      

                               NULL        NULL            50000.0     

FM                             8           1-6-145         10000.0
FM                             8           NULL            10000.0
FM                             9           1-6-141         50000.0
FM                             9           1-6-145         12850.0
FM                             9           NULL            62850.0
FM                             NULL        NULL            72850.0
JH                             7           1-6-145         0.0
JH                             7           NULL            0.0
JH                             8           1-6-141         8500.0
JH                             8           1-6-145         21200.0
JH                             8           NULL            29700.0
JH                             NULL        NULL            29700.0
NULL                           NULL        NULL            152550.0    
NULL                           7           1-6-145         0.0         
NULL                           7           NULL            0.0         
NULL                           8           1-6-141         8500.0
NULL                           8           1-6-145         31200.0
NULL                           8           NULL            39700.0
NULL                           9           1-6-141         100000.0
NULL                           9           1-6-145         12850.0
NULL                           9           NULL            112850.0
                               NULL        1-6-141         50000.0    
FM                             NULL        1-6-141         50000.0
JH                             NULL        1-6-141         8500.0
NULL                           NULL        1-6-141         108500.0       
FM                             NULL        1-6-145         22850.0
JH                             NULL        1-6-145         21200.0
NULL                           NULL        1-6-145         44050.0

(所影响的行数为 31 行)
*/
--------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题描述: 在数据处理中经常需要对大量数据进行汇总,将相同关键字记录的某些数据项的值叠加起来,生成一个分类汇总表。 假设某超级市场销售有m种商品(假设商品的编号为1,2,3,┅┅,m),有n台前台收款机(假设收款机的编号为1,2,3,┅┅,n)进行收款,以记录的形式提供给计算机,每个记录表示某台收款机的一种商品一次交易的数量和销售额。记录由4个域组成:收款机编号、商品编号、销售数量、销售金额。构造一个结构体类型,每次销售数据以一个结构体变量保存在一个数据文件中。 实现要求: ⑴ 编写实现将数据记录插入到数据文件的最后的函数; ⑵ 编写以收款机为单位的数据分类处理函数。构造n个单链表,每个链表保存一台收款机的销售记录,这n个单链表的头指针存放在一个指针数组中,通过数组的下标就可以知道是哪台收款机。读取数据文件的记录,将所有的销售记录(数据文件中的全部记录)分解插入到n个单链表; ⑶ 统计每台收款机的销售总额; ⑷ 编写以商品为单位的数据分类处理函数。构造m个单链表,每个链表保存一种商品的销售记录,这m个单链表的头指针存放在一个指针数组中,通过数组的下标就可以知道是哪种商品。读取数据文件的记录,将所有的销售记录(数据文件中的全部记录)分解插入到m个单链表; ⑸ 以商品为单位,统计每种商品的销售总额。 ⑹ 设计一个菜单,具有插入数据记录、按收款机统计销售总额、按商品统计销售总额、退出系统等最基本的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值