程序员人生 网站导航

MYSQL API之 WITH ROLLUP

栏目:数据库应用时间:2015-01-21 09:06:40

GROUP BY子句允许1个将额外行添加到简略输出端 WITH ROLLUP 修饰符。这些行代表高层(或高聚集)简略操作。ROLLUP 因此允许你在多层分析的角度回答有关询问的问题。例如,它可以用来向OLAP (联机分析处理) 操作提供支持。

假想1个名为sales 的表具有年份、国家、产品及记录销售利润的利润列:

CREATE TABLE sales

(

    year    INT NOT NULL,

    country VARCHAR(20) NOT NULL,

    product VARCHAR(32) NOT NULL,

    profit  INT

);

可使用这样的简单GROUP BY,每一年对表的内容做1次总结:

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year;

+------+-------------+

| year | SUM(profit) |

+------+-------------+

| 2000 |        4525 |

| 2001 |        3010 |

+------+-------------+

这个输出结果显示了每一年的总利润, 但如果你也想肯定所有年份的总利润,你必须自己累加每一年的单个值或运行1个加法询问。

或你可使用 ROLLUP, 它能用1个询问提供双层分析。将1个 WITH ROLLUP修饰符添加到GROUP BY 语句,使询问产生另外一行结果,该行显示了所有年份的总价值:

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP;

+------+-------------+

| year | SUM(profit) |

+------+-------------+

| 2000 |        4525 |

| 2001 |        3010 |

| NULL |        7535 |

+------+-------------+

总计高聚集行被年份列中的NULL值标出。

当有多重 GROUP BY 列时,ROLLUP产生的效果更加复杂。这时候,每次在除最后1个分类列以外的任何列出现1个 “break” (值的改变) ,则问讯会产生1个高聚集累计行。

例如,在没有 ROLLUP的情况下,1个以年、国家和产品为基础的关于 sales 表的1览表可能以下所示:

mysql> SELECT year, country, product, SUM(profit)

    -> FROM sales

    -> GROUP BY year, country, product;

+------+---------+------------+-------------+

| year | country | product    | SUM(profit) |

+------+---------+------------+-------------+

| 2000 | Finland | Computer   |        1500 |

| 2000 | Finland | Phone      |         100 |

| 2000 | India   | Calculator |         150 |

| 2000 | India   | Computer   |        1200 |

| 2000 | USA     | Calculator |          75 |

| 2000 | USA     | Computer   |        1500 |

| 2001 | Finland | Phone      |          10 |

| 2001 | USA     | Calculator |          50 |

| 2001 | USA     | Computer   |        2700 |

| 2001 | USA     | TV         |         250 |

+------+---------+------------+-------------+

表示总值的输出结果仅位于年/国家/产品的分析级别。当添加了 ROLLUP后, 询问会产生1些额外的行:

mysql> SELECT year, country, product, SUM(profit)

    -> FROM sales

    -> GROUP BY year, country, product WITH ROLLUP;

+------+---------+------------+-------------+

| year | country | product    | SUM(profit) |

+------+---------+------------+-------------+

| 2000 | Finland | Computer   |        1500 |

| 2000 | Finland | Phone      |         100 |

| 2000 | Finland | NULL       |        1600 |

| 2000 | India   | Calculator |         150 |

| 2000 | India   | Computer   |        1200 |

| 2000 | India   | NULL       |        1350 |

| 2000 | USA     | Calculator |          75 |

| 2000 | USA     | Computer   |        1500 |

| 2000 | USA     | NULL       |        1575 |

| 2000 | NULL    | NULL       |        4525 |

| 2001 | Finland | Phone      |          10 |

| 2001 | Finland | NULL       |          10 |

| 2001 | USA     | Calculator |          50 |

| 2001 | USA     | Computer   |        2700 |

| 2001 | USA     | TV         |         250 |

| 2001 | USA     | NULL       |        3000 |

| 2001 | NULL    | NULL       |        3010 |

| NULL | NULL    | NULL       |        7535 |

+------+---------+------------+-------------+

对这个询问, 添加ROLLUP 子句使村输出结果包括了4层分析的简略信息,而不只是1个下面是怎样解释  ROLLUP输出:

  • 1组给定的年份和国家的每组产品行后面, 会产生1个额外的总计行, 显示所有产品的总值。这些即将产品列设置为 NULL。
  • 1组给定年份的行后面,会产生1个额外的总计行,显示所有国家和产品的总值。这些即将国家和产品列设置为  NULL。
  • 最后, 在所有其它行后面,会产生1个额外的总计列,显示所有年份、国家及产品的总值。 这1即将年份、国家和产品列设置为 NULL。

使用ROLLUP 时的其它注意事项

以下各项列出了1些MySQL履行ROLLUP的特殊状态: 

当你使用 ROLLUP时, 你不能同时使用 ORDER BY子句进行结果排序。换言之, ROLLUP 和ORDER BY 是相互排挤的。但是,你仍可以对排序进行1些控制。在 MySQL中, GROUP BY 可以对结果进行排序,而且你可以在GROUP BY列表指定的列中使用明确的 ASC和DESC关键词,从而对个别列进行排序。 (不论如何排序被ROLLUP添加的较高级别的总计行仍出现在它们被计算出的行后面)。  

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐