zoukankan      html  css  js  c++  java
  • 使用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           

  • 相关阅读:
    设置tomcat访问根路径
    关于Java抽象类的理解
    JavaIO
    synchronized关键字
    Java线程池
    Codeforces1478F-Nezzar and Nice Beatmap
    Codeforces1477B-Nezzar and Binary String
    Codeforces1476D Journey
    Codeforces1478D Nezzar and Board
    Codeforces Round #697 (Div. 3)G. Strange Beauty
  • 原文地址:https://www.cnblogs.com/itecho/p/1322240.html
Copyright © 2011-2022 走看看