使用CUBE和ROLLUP对数据进行汇总

在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。

SELECT SUM(population) FROM bbc

  这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有国家的总人口数。

  通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值,也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值。

  HAVING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前.
而 HAVING子句在聚合后对组记录进行筛选。

  让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句,还采用第三节介绍的bbc表。

  SQL实例:

  一、显示每个地区的总人口数和总面积:

SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region

  先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。

  二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。

SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000

  在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。

  相反,HAVING子句可以让我们筛选成组后的各组数据.

 

SELECT AVG(ticket_key) , ticket_title
FROM srweb_ticket_ticket
GROUP BY ticket_title

以上这句是按照投票的标题排序,体现在GROUP BY ticket_title,执行完上序之后得出如下的结果
328       苹果
328       葡萄
327       西瓜

如果加上having条件的话会出现如下的结果,having是出现在group by之后的条件的
SELECT AVG(ticket_key) , ticket_title
FROM srweb_ticket_ticket
GROUP BY ticket_title having AVG(ticket_key)>327

328       苹果
328       葡萄

如果再加上where条件的话会出现下面的结果
SELECT AVG(ticket_key) , ticket_title
FROM srweb_ticket_ticket
where ticket_title not in('葡萄') GROUP BY ticket_title having AVG(ticket_key)>327

328       苹果

通过分析,式子。。首先是执行where条件去掉一些不满足的,之后通过group by按照类型进行分组运算,之后在分组求了数的基础上再用having去掉一些数据

 

 

GROUP BY...

把 GROUP BY 加入 SQL 的原因是,合计函数(比如 SUM)在每次被调用后会返回所有列的合计,如果没有 GROUP BY,就无法计算每个单独列值组合的总和。

GROUP BY 的语法:

SELECT column,SUM(column) FROM table GROUP BY column 

GROUP BY 实例

表 "Sales":

Company Amount
W3School 6500
IBM 5500
W3School 7300

SQL:

SELECT Company, SUM(Amount) FROM Sales  

结果:

Company SUM(Amount)
W3School 19300
IBM 19300
W3School 19300

上面的代码是无效的,这是由于被返回的列没有进行部分合计。GROUP BY 子句能解决这个问题:

SELECT Company,SUM(Amount) FROM Sales GROUP BY Company 

结果:

Company SUM(Amount)
W3School 13800
IBM 5500

HAVING...

把 HAVING 加入 SQL 的原因是,WHERE 无法应用于合计函数,而如果没有 HAVING,就无法测试结果条件。

HAVING 的语法:

SELECT column,SUM(column) FROM table GROUP BY column HAVING SUM(column) condition value 

表 "Sales":

Company Amount
W3School 6500
IBM 5500
W3School 7300

SQL:

SELECT Company,SUM(Amount) FROM Sales GROUP BY Company HAVING SUM(Amount)>10000  

结果:

Company SUM(Amount)
W3School 13800
 
【IT168 编程开发】首先讲讲GROUP BY 子句语法:

  SELECT column1, SUM(column2)

  FROM "list-of-tables"

  GROUP BY "column-list";

  这个GROUP BY子句将集中所有的行在一起,它包含了指定列的数据以及允许合计函数来计算一个或者多个列。当然最好解释的方法是给出一个例子啦:

  假设我们将从employee表中搜索工资最高的列,可以使用以下的SQL语句:

  SELECT max(salary), dept

  FROM employee

  GROUP BY dept;

  这条语句将在每一个单独的部门中选择工资最高的工资。结果他们的salary和dept将被返回。
 
 

cube操作符
要使用cube,首先要了解group by
其实cube和rollup区别不太大,只是在基于group by 子句创建和汇总分组的可能的组合上有一定差别,
cube将返回的更多的可能组合。如果在 group by 子句中有n个列或者是有n个表达式的话,
sqlserver在结果集上会返回2的n-1次幂个可能组合。
注意:
使用cube操作符时,最多可以有10个分组表达式
在cube中不能使用all关键字
例子:
我们在数据库统计中常常要查询以下情况:
如一个定单数据库,我们要知道每个定单的每个产品数量,每个定单的所有产品数量,所有定单的某一产品数量,所有定单所有产品总量这些汇总信息。这时使用cube就十分方便了。当然不需要这么多信息或者只想知道某一具体产品、具体某一定单,某一时间关系(前,后,之间)等等具体信息的话,只需在where中限定即可
先举一个例子,是所有情况的:
一个数据库表中记载了一个产品定购情况:
现共有三种产品(1,2,3),已经下了两个定单(1,2)
sql语句:
select productid,orderid SUM(quantity) AS total FROM order GROUP BY productid,orderid WITH CUBE
ORDER BY productid,orderid
运行后得到结果:
productid   orderid   total
null          null     95                      所有定单所有产品总量
null           1       30                      定单1所有产品数量
null           2       65                      定单2所有产品数量
1             null     15                      所有定单产品1总量
1              1        5                      定单1产品1数量
1              2       10                      定单2产品1数量
2             null     35                      所有定单产品2总量
2              1       10                      定单1产品2数量
2              2       25                      定单2产品2数量 
3             null     45                      所有定单产品3总量  
3              1       15                      定单1产品3数量
3              2       30           

posted @ 2008-10-29 16:43  itecho  阅读(439)  评论(0编辑  收藏  举报