偶然间在学习过程中看到一篇博客文章,看到在讲解group by? 查看后发现和平时的语法不太一致,在学习后纪录此篇文章。

本次演示环境为 SQL SERVER 2012

其他语言可能存在语法偏差,有兴趣的可以自己尝试。
Gruop by 你用对了吗?-01.png

创建表和测试数据

-- 创建测试表  
-- salesperson 销售人员姓名
-- sales_department 销售部门
-- sales_quantity 销售数量

CREATE TABLE dbo.sales_data (
    salesperson NVARCHAR(50),
    sales_department NVARCHAR(50),
    sales_quantity INT
);

-- 插入测试数据
INSERT INTO dbo.sales_data (salesperson, sales_department, sales_quantity)
VALUES 
('张三', '销售一部', 10),
('李四', '销售一部', 15),
('王五', '销售二部', 20),
('赵六', '销售二部', 25),
('孙七', '销售三部', 30),
('周八', '销售三部', 35);

-- 查询插入的数据以验证
SELECT * FROM sales_data;    

ROLLUP 的使用

-- 按销售部门和销售人员姓名进行分组,并计算销售数量的总和
SELECT sales_department, salesperson, SUM(sales_quantity) AS total_sales
FROM sales_data
GROUP BY ROLLUP(sales_department, salesperson)
ORDER BY sales_department DESC ;

Gruop by 你用对了吗?-02.png

可以看到对每一个部门销售人员的销售数量总和,以及总计。

-- 按销售部门进行分组,并计算销售数量的总和
SELECT sales_department, SUM(sales_quantity) AS total_sales
FROM sales_data
GROUP BY ROLLUP(sales_department)
ORDER BY sales_department DESC; 

Gruop by 你用对了吗?-03.png

可以看到,当我们使用ROLLUP时,会在最后一行显示总计。

通过 GROUP BY 对数据进行分组,SUM 函数计算每个分组的销售总量,ROLLUP 操作生成各级别的汇总数据,使得查询结果不仅包含明细信息,还包含了有用的统计汇总信息,方便进行数据分析和报表生成。

CUBE 的使用

CUBE 和 ROLLUP 对参数的处理是不同的,CUBE 会对每一个参数进行汇总,而 ROLLUP 只会对最后一个参数进行汇总。

-- 按销售部门和销售人员姓名进行分组,并按照维度计算销售数量的总和
SELECT sales_department, salesperson, SUM(sales_quantity) AS total_sales
FROM sales_data
GROUP BY CUBE(sales_department, salesperson)
ORDER BY sales_department  DESC, salesperson DESC ;

Gruop by 你用对了吗?-04.png

可以看出首先对sales_department、salesperson 进行分组汇总,然后对sales_department进行汇总,之后对salesperson分组汇总,最后一行为全表汇总。

Grouping Set 的使用

-- 按销售部门和销售人员姓名进行分组统计,不计算总和
SELECT sales_department, salesperson, SUM(sales_quantity) AS total_sales
FROM sales_data
GROUP BY GROUPING SETS( sales_department  ,  salesperson  )
ORDER BY sales_department DESC, salesperson DESC;

Gruop by 你用对了吗?-05.png

按照传入维度进行分组统计,但不计算维度总和

-- 按销售部门和销售人员姓名进行分组统计,计算总和
SELECT sales_department, salesperson, SUM(sales_quantity) AS total_sales
FROM sales_data
GROUP BY GROUPING SETS( sales_department  ,  salesperson ,() )
ORDER BY sales_department DESC, salesperson DESC;

Gruop by 你用对了吗?-06.png