MySQL-分组函数ROLLUP的基本用法

科技资讯 投稿 5300 0 评论

MySQL-分组函数ROLLUP的基本用法

一、ROLLUP简介

ROLLUP是GROUP BY子句的扩展。 ROLLUP选项允许包含表示小计的额外行,通常称为超级聚合行,以及总计行。 通过使用ROLLUP选项,可以使用单个查询生成多个分组集。

MySQL中的ROLLUP是用于 产生汇总输出的修饰符,包括表示超级汇总(较高级别汇总操作的额外行。它使我们能够使用单个查询在多个分析级别上汇总输出。它主要用于为OLAP(在线分析处理操作提供支持。

二、基本语法

SELECT 
    column1, column2, ...
FROM 
    table_name
GROUP BY
column1, column2,... WITH ROLLUP;

我们指定了 GROUP BY 子句,其中包括我们要基于其聚合数据的列名。最后,我们指定 WITH ROLLUP 修饰符以在另一行中获得超级聚合输出。

三、ROLLUP的使用

例如,假设我们有一个包含以下数据的表 " sales" :

CREATE TABLE IF NOT EXISTS sales ( id BIGINT COMMENT 'ID', years INT COMMENT '年份', country VARCHAR(20 COMMENT '国家', product VARCHAR(32 COMMENT '产品', sales INT COMMENT '销售额', PRIMARY KEY(id ; insert into sales VALUES (1,2000,'Finland','Computer',1500, (2,2000,'Finland','Phone',100, (3,2000,'India','Calculator',150, (4,2000,'India','Computer',1200, (5,2000,'USA','Calculator',75, (6,2000,'USA','Computer',1500, (7,2001,'Finland','Phone',100, (8,2001,'USA','Calculator',50, (9,2001,'USA','Computer',2700, (10,2001,'USA','TV',250;

如果要每年总结结果,我们将使用简单的GROUP BY子句,如下所示:

SELECT years, SUM(sales AS total_sales FROM sales GROUP BY years;

它将给出以下输出,显示每年的总销售额(总计:

SELECT
years,
SUM(sales AS total_sales
FROM  sales  
GROUP BY years
UNION ALL
SELECT
null as years,
SUM(sales AS  total_sales
FROM  sales ;  

在此查询中,我们可以看到NULL列。这是因为 UNION ALL子句要求所有查询具有相同的列数。因此,为了满足此要求,我们在第二个查询的选择列表中添加了NULL。

年份列的输出中的NULL表示超级总计的总计值。由于此查询能够产生每年的总销售额以及总销售额的总和,因此,它有两个问题:

为解决这些问题,MySQL允许我们使用ROLLUP子句,该子句在一个查询中提供了两种分析级别。 ROLLUP子句是GROUP BY子句的扩展,该子句产生另一行并显示总计(超级聚合值。

SELECT
years,
SUM(sales AS total_sales
FROM sales
GROUP BY years WITH ROLLUP;

执行命令时,将得到如下输出:

Year列中看到 NULL 值,该值标识了超级汇总行。它清楚地表明ROLLUP子句不仅生成小计,而且给出了全年的总销售额。

ROLLUP修饰符假定GROUP BY子句中指定的列之间的层次结构。每次列值发生变化时,查询都会在结果末尾生成一个额外的超级汇总摘要行。

GROUP BY c1, c2, c3 WITH ROLLUP

c1 > c2 > c3

(c1, c2, c3

(c1, c2

(c1

(

SELECT
years,
country,
product,
SUM(sales AS total_sales
FROM sales
GROUP BY years, country, product ;

如果没有ROLLUP,则基于GROUP BY子句中指定的多个列的销售表摘要如下所示。在这里,我们将仅在年份/国家/产品分析级别获得摘要值。

SELECT
years,
country,
product,
SUM(sales AS total_sales
FROM sales
GROUP BY years, country, product WITH ROLLUP;

请参见以下输出:

首先,给定年份和国家/地区的每组产品行都会生成一个额外的超级汇总摘要行,该行显示所有产品的总数。它将产品列设置为NULL。接下来,给定年份的每组行都会生成一个额外的超级汇总摘要行,该行显示所有国家和产品的总计。它将"国家和地区"和"产品"列设置为NULL。最后,对于所有其他行,它会生成一个额外的超级汇总摘要行,该行显示所有列的总计。它将Years,Country和Products列设置为NULL。

四、GROUPING(函数

我们可以在选择列表, HAVING 子句和 ORDER BY 子句中使用GROUPING(函数。

SELECT
years,
country,
product,
SUM(sales AS total_sales,
GROUPING(years,
GROUPING(country,
GROUPING(product
FROM sales
GROUP BY years, country, product WITH ROLLUP;

当超级集合行中 Years 列中的NULL出现时, GROUPING(Years返回1,我们将得到以下输出。否则,它将返回零。

GROUPING(Country将返回1、否则,它将返回零。

GROUPING(produce返回1、否则,它将返回零。

以下查询说明了如何将 IF(函数与GROUPING(函数组合以替换标签"年份","国家/地区"和"产品"列中的超级汇总NULL值:

SELECT IF(GROUPING(years, 'All years', years AS years, IF(GROUPING(country, 'All countries', country AS country, IF(GROUPING(product, 'All products', product AS product, SUM(sales AS Total_Sales FROM sales GROUP BY years, country, product WITH ROLLUP;

我们将得到如下输出:

示例: 分组(年份,国家/地区,产品

  result for GROUPING(product

+ result for GROUPING(country << 1

+ result for GROUPING(years << 2

使用多个参数GROUPING(函数示例:

SELECT years, country, product, SUM(sales AS Total_Sales, GROUPING(years,country,product AS Grouping_Result FROM sales GROUP BY years, country, product WITH ROLLUP;

它将给出以下输出:

SELECT
years,
country,
product,
SUM(sales AS Total_Sales
FROM sales
GROUP BY years, country, product WITH ROLLUP
HAVING GROUPING(years, country, product <> 0;

它将给出以下输出:

 

编程笔记 » MySQL-分组函数ROLLUP的基本用法

赞同 (21) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽