SQL中CUBE/rollup 的区别
来源:互联网 发布:李兴华java介绍 编辑:程序博客网 时间:2024/05/19 10:08
ROLLUP 运算符生成的结果集类似于 CUBE 运算符生成的结果集。 下面是 CUBE 和 ROLLUP 之间的具体区别: 创建表: CREATE TABLE DEPART INSERT INTO DEPART SELECT 'A','ZHANG',100 部门 员工 工资 A ZHANG 100 (1)GROUP BY SELECT 部门,员工,SUM(工资)AS TOTAL 结果: A DUAN 500 (2)ROLLUP SELECT 部门,员工,SUM(工资)AS TOTAL 结果如下: A DUAN 500 ROLLUP结果集中多了三条汇总信息:即部门A的合计,部门B的合计以及总合计。其中将部门B中的DUAN合计。 SELECT 部门,员工,SUM(工资)AS TOTAL 结果: A DUAN 500 (3)CUBE SELECT 部门,员工,SUM(工资)AS TOTAL 结果: A DUAN 500 CUBE的结果集是在 ROLLUP结果集的基础上多了5行,这5行相当于在ROLLUP结果集上在union 上以员工 (即CUBE)为 GROUP BY的结果。 SELECT 部门,员工,SUM(工资)AS TOTAL SELECT 部门,员工,SUM(工资)AS TOTAL union SELECT 'NULL',员工,SUM(工资)AS TOTAL 结果: NULL NULL 2800 **************************************************************** rollup 举例 **************************************************************** 这里介绍sql server2005里面的一个使用实例: CREATE TABLE tb(province nvarchar(10),city nvarchar(10),score int) INSERT tb SELECT '陕西','西安',3 UNION ALL SELECT '陕西','安康',4 UNION ALL SELECT '陕西','汉中',2 UNION ALL SELECT '广东','广州',5 UNION ALL SELECT '广东','珠海',2 UNION ALL SELECT '广东','东莞',3 UNION ALL SELECT '江苏','南京',6 UNION ALL SELECT '江苏','苏州',1 GO 1、 只有一个汇总 select province as 省,sum(score) as 分数 from tb group by province with rollup 结果: 广东 10 江苏 7 陕西 9 NULL 26 select case when grouping(province)=1 then '合计' else province end as 省,sum(score) as 分数 from tb group by province with rollup 结果: 广东 10 江苏 7 陕西 9 合计 26 2、两级,中间小计最后汇总 select province as 省,city as 市,sum(score) as 分数 from tb group by province,city with rollup 结果: 广东 东莞 3 广东 广州 5 广东 珠海 2 广东 NULL 10 江苏 南京 6 江苏 苏州 1 江苏 NULL 7 陕西 安康 4 陕西 汉中 2 陕西 西安 3 陕西 NULL 9 NULL NULL 26 select province as 省,city as 市,sum(score) as 分数,grouping(province) as g_p,grouping(city) as g_c from tb group by province,city with rollup 结果: 广东 东莞 3 0 0 广东 广州 5 0 0 广东 珠海 2 0 0 广东 NULL 10 0 1 江苏 南京 6 0 0 江苏 苏州 1 0 0 江苏 NULL 7 0 1 陕西 安康 4 0 0 陕西 汉中 2 0 0 陕西 西安 3 0 0 陕西 NULL 9 0 1 NULL NULL 26 1 1 select case when grouping(province)=1 then '合计' else province end 省, case when grouping(city)=1 and grouping(province)=0 then '小计' else city end 市, sum(score) as 分数 from tb group by province,city with rollup 结果: 广东 东莞 3 广东 广州 5 广东 珠海 2 广东 小计 10 江苏 南京 6 江苏 苏州 1 江苏 小计 7 陕西 安康 4 陕西 汉中 2 陕西 西安 3 陕西 小计 9 合计 NULL 26 **************************************************************** cube举例 **************************************************************** 使用cube操作符时,最多可以有10个分组表达式 在cube中不能使用all关键字 例如,简单表 Inventory 包含下列数据: 以下查询将返回一个结果集,其中包含 下面是结果集: 我们着重考查结果集中的以下几行: 此行报告了在 这一行类似,但报告的是 这一行报告了**数据集的总计。 这两行报告了 CUBE 操作生成空值将会带来一个问题:如何区分 CUBE 操作生成的 NULL 值和在实际数据中返回的 NULL 值?可以使用 GROUPING 函数解决此问题。如果列值来自事实数据,GROUPING 函数将返回 0;如果列值是由 CUBE 操作生成的 NULL,则返回 1。在 CUBE 操作中,生成的 NULL 代表所有值。可以编写 SELECT 语句以使用 GROUPING 函数将生成的任一 NULL 替换为字符串 ALL。由于事实数据中的 NULL 表示数据值未知,因此也可以将 SELECT 编码为返回字符串 UNKNOWN,用于表示事实数据中的 NULL。例如: CUBE 运算符可用于生成 n 维的**数据集,即具有任意维数的**数据集。只有一个维度的**数据集可用于生成合计,例如: 此 包含具有多个维度的 CUBE 的 SELECT 语句可生成大型结果集,因为这些语句会为所有维度中各值的所有组合都生成相应的行。这些大型结果集包含的数据可能会过多而不易于阅读和理解。此问题的一种解决办法是将 然后即可用该视图来仅查询您感兴趣的维度值:
ROLLUP 优点:
下面对比一下GROUP BY 、CUBE 和 ROLLUP后的结果
(部门 char(10),员工 char(6),工资 int)
INSERT INTO DEPART SELECT 'A','LI',200
INSERT INTO DEPART SELECT 'A','WANG',300
INSERT INTO DEPART SELECT 'A','ZHAO',400
INSERT INTO DEPART SELECT 'A','DUAN',500
INSERT INTO DEPART SELECT 'B','DUAN',600
INSERT INTO DEPART SELECT 'B','DUAN',700
A LI 200
A WANG 300
A ZHAO 400
A DUAN 500
B DUAN 600
B DUAN 700
from DEPART
GROUP BY 部门,员工
B DUAN 1300
A LI 200
A WANG 300
A ZHANG 100
A ZHAO 400
from DEPART
GROUP BY 部门,员工 WITH ROLLUP
A LI 200
A WANG 300
A ZHANG 100
A ZHAO 400
A NULL 1500
B DUAN 1300
B NULL 1300
NULL NULL 2800等价于下列SQL语句
from DEPART
GROUP BY 部门,员工
union
SELECT 部门,'NULL',SUM(工资)AS TOTAL
from DEPART
GROUP BY 部门
union
SELECT 'NULL','NULL',SUM(工资)AS TOTAL
from DEPART
A LI 200
A NULL 1500
A WANG 300
A ZHANG 100
A ZHAO 400
B DUAN 1300
B NULL 1300
NULL NULL 2800
from DEPART
GROUP BY 部门,员工 WITH CUBE
A LI 200
A WANG 300
A ZHANG 100
A ZHAO 400
A NULL 1500
B DUAN 1300
B NULL 1300
NULL NULL 2800
NULL DUAN 1800
NULL LI 200
NULL WANG 300
NULL ZHANG 100
NULL ZHAO 400
from DEPART
GROUP BY 部门,员工 WITH CUBE等价于下列的SQL语句:
from DEPART
GROUP BY 部门,员工 WITH ROLLUP
from DEPART
GROUP BY 员工
A NULL 1500
A DUAN 500
A LI 200
A WANG 300
A ZHANG 100
A ZHAO 400
B NULL 1300
B DUAN 1300
NULL DUAN 1800
NULL LI 200
NULL WANG 300
NULL ZHANG 100
NULL ZHAO 400举例
使用 GROUPING 区分空值
**数据集
- SQL中CUBE/rollup 的区别
- SQL中CUBE/rollup 的区别
- SQL 中ROLLUP、CUBE的用法和区别
- SQL中CUBE和ROLLUP的用法
- SQL 中ROLLUP ,cube用法
- SQL中rollup与cube
- rollup 和 cube 的区别
- SQL ---CUBE 和 ROLLUP 之间的具体区别
- SQL 中ROLLUP、CUBE 用法 (转)
- SQL SERVER中GROUPING SETS,CUBE,ROLLUP
- sql 的cube rollup 和grouping
- CUBE 和 ROLLUP 之间的具体区别
- CUBE 和 ROLLUP 之间的具体区别
- CUBE 和 ROLLUP 之间的具体区别
- ROLLUP、CUBE、GROUP BY的使用区别
- CUBE 和 ROLLUP 之间的具体区别
- CUBE 和 ROLLUP 之间的具体区别
- CUBE 和 ROLLUP 之间的具体区别
- DC功能介绍(5)重复的
- 时间格式转换函数convert
- 深入.NET平台和C#编程 第一章 学习笔记
- 深入.NET平台和C#编程 第二章 学习笔记
- 深入.NET平台和C#编程 第三章 学习笔记
- SQL中CUBE/rollup 的区别
- 我的第一次C语言课
- 什么是框架,框架和设计模式的关系,为什么要用框架
- 模式和框架
- c与C++
- 奋斗
- 2个星期项目演示
- 程序员能力矩阵 你属于哪一层?
- 用CSS缩写给你的网站加速