Group by Grouping
玩转数据库之 Group by Grouping
有的时候我们要从数据库里把数据组织成树结构再展现到页面上
像下面这样
今天我们用Group 和Grouping实现它,并总结一下它俩。
先看一下概念,再用代码一点一点去理解它们,最后我会给出完整的代码
Group By : 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
Grouping :指示是否聚合 GROUP BY 列表中的指定列表达式。 在结果集中,如果 GROUPING 返回 1 则指示聚合;
返回 0 则指示不聚合。 如果指定了 GROUP BY,则 GROUPING 只能用在 SELECT <select> 列表、HAVING 和 ORDER BY 子句中。
ROLLUP :生成简单的 GROUP BY 聚合行以及小计行或超聚合行,还生成一个总计行。
让我们先建一个数据库,并添加一些数据
use master go if exists(select 1 from sysdatabases where name ='MyGroupDB') ALTER DATABASE MyGroupDB SET SINGLE_USER with ROLLBACK IMMEDIATE drop database MyGroupDBgocreate database MyGroupDBgouse MyGroupDBgocreate Table Category( Category_ID int identity(1,1), Category_Name varchar(100))gocreate Table Product( Product_ID int identity(1,1), CategoryID int , Product_Name varchar(100))goinsert into Category values('手机')insert into Category values('台式机')insert into Category values('数码相机')goinsert into Product values(1,'诺基亚')insert into Product values(1,'三星')insert into Product values(1,'苹果')insert into Product values(2,'HP')insert into Product values(2,'IBM')insert into Product values(2,'Dell')insert into Product values(3,'佳能')insert into Product values(3,'尼康')insert into Product values(3,'索尼')go |
看一下它们的数据
select * from Category left join Product on Category_ID = CategoryID |

我们把它们用Group By分一下组

select Category_ID ,
Category_Name,
CategoryID,
Product_Name
from Category
left join Product on Category_ID = CategoryID
group by Category_ID ,CategoryID,Category_Name,Product_Name


我们看到这样和没有分组时展现的数据是一样的,让我们加上 ROLLUP 加上合计行
select Category_ID , Category_Name, CategoryID, Product_Name from Category left join Product on Category_ID = CategoryIDgroup by Category_ID ,CategoryID,Category_Name,Product_Name with rollup |
我们看到了好多NULL数据,而且很有规律
这些规律我们可以用Grouping 看到
select Category_ID , GROUPING(Category_ID) as Category_IDGP, Category_Name, GROUPING(Category_Name) as Category_NameGP, CategoryID, GROUPING(CategoryID) as CategoryIDGP, Product_Name, GROUPING(Product_Name) as Product_NameGPfrom Category left join Product on Category_ID = CategoryIDgroup by Category_ID ,Category_Name,CategoryID,Product_Name with rollup |

你会发现那些Null值就是Grouping 为1的时候
最后一行的合计是Categrory_ID的,我们不需要,CategoryID的合计我们也不需要我们要怎么去掉它们呢,在having 里
select Category_ID , GROUPING(Category_ID) as Category_IDGP, CategoryID, GROUPING(CategoryID) as CategoryIDGP, Category_Name, GROUPING(Category_Name) as Category_NameGP, Product_Name, GROUPING(Product_Name) as Product_NameGPfrom Category left join Product on Category_ID = CategoryIDgroup by Category_ID ,Category_Name,CategoryID,Product_Name with rolluphaving GROUPING(Category_ID)=0 and GROUPING(CategoryID)=0 |

这样的结果 我们看到只有Product_Name的Grouping有为1 了
我们就是用它去实现这棵树
selectcase GROUPING(Product_Name) when 1 then Category_Name else '' end as Category_Name,case GROUPING(Product_Name) when 0 then Product_Name else '' end as Product_Namefrom Category left join Product on Category_ID = CategoryIDgroup by Category_ID ,Category_Name,CategoryID,Product_Name with rolluphaving GROUPING(Category_ID)=0 and GROUPING(CategoryID)=0 order by Category_ID ,Product_Name |

下面是完整的代码
use master go if exists(select 1 from sysdatabases where name ='MyGroupDB') ALTER DATABASE MyGroupDB SET SINGLE_USER with ROLLBACK IMMEDIATE drop database MyGroupDBgocreate database MyGroupDBgouse MyGroupDBgocreate Table Category( Category_ID int identity(1,1), Category_Name varchar(100))gocreate Table Product( Product_ID int identity(1,1), CategoryID int , Product_Name varchar(100))goinsert into Category values('手机')insert into Category values('台式机')insert into Category values('数码相机')goinsert into Product values(1,'诺基亚')insert into Product values(1,'三星')insert into Product values(1,'苹果')insert into Product values(2,'HP')insert into Product values(2,'IBM')insert into Product values(2,'Dell')insert into Product values(3,'佳能')insert into Product values(3,'尼康')insert into Product values(3,'索尼')goselect * from Category left join Product on Category_ID = CategoryID--------------------------------------------------------select Category_ID , Category_Name, CategoryID, Product_Name from Category left join Product on Category_ID = CategoryIDgroup by Category_ID ,CategoryID,Category_Name,Product_Name with rollup--------------------------------------------------------select Category_ID , GROUPING(Category_ID) as Category_IDGP, Category_Name, GROUPING(Category_Name) as Category_NameGP, CategoryID, GROUPING(CategoryID) as CategoryIDGP, Product_Name, GROUPING(Product_Name) as Product_NameGPfrom Category left join Product on Category_ID = CategoryIDgroup by Category_ID ,Category_Name,CategoryID,Product_Name with rollup----------------------select Category_ID , GROUPING(Category_ID) as Category_IDGP, CategoryID, GROUPING(CategoryID) as CategoryIDGP, Category_Name, GROUPING(Category_Name) as Category_NameGP, Product_Name, GROUPING(Product_Name) as Product_NameGPfrom Category left join Product on Category_ID = CategoryIDgroup by Category_ID ,Category_Name,CategoryID,Product_Name with rolluphaving GROUPING(Category_ID)=0 and GROUPING(CategoryID)=0 -------------------------selectcase GROUPING(Product_Name) when 1 then Category_Name else '' end as Category_Name,case GROUPING(Product_Name) when 0 then Product_Name else '' end as Product_Namefrom Category left join Product on Category_ID = CategoryIDgroup by Category_ID ,Category_Name,CategoryID,Product_Name with rolluphaving GROUPING(Category_ID)=0 and GROUPING(CategoryID)=0 order by Category_ID ,Product_Name |
Group by Grouping的更多相关文章
- 玩转数据库之 Group by Grouping
有的时候我们要从数据库里把数据组织成树结构再展现到页面上 像下面这样 今天我们用Group 和Grouping实现它,并总结一下它俩. 先看一下概念,再用代码一点一点去理解它们,最后我会给出完整的代码 ...
- Group By Grouping Sets
Group by分组函数的自定义,与group by配合使用可更加灵活的对结果集进行分组,Grouping sets会对各个层级进行汇总,然后将各个层级的汇总值union all在一起,但却比单纯的g ...
- Oracle PL/SQL之GROUP BY GROUPING SETS
[转自] http://blog.csdn.net/t0nsha/article/details/6538838 使用GROUP BY GROUPING SETS相当于把需要GROUP的集合用UNIO ...
- GROUP BY GROUPING SETS 示例
--建表 create table TEst1 ( ID ), co_CODE ), T_NAME ), Money INTEGER, P_code ) ); --插入基础数据 insert into ...
- group by <grouping sets(...) ><cube(...)>
GROUP BY GROUPING SETS() 后面将还会写学习 with cube, with rollup,以及将它们转换为标准的GROUP BY的子句GROUP SET(), CU ...
- SQL GROUP BY GROUPING SETS,ROLLUP,CUBE(需求举例)
实现按照不同级别分组统计 关于GROUP BY 中的GROUPING SETS,ROLLUP,CUBE 从需求的角度理解会更加容易些. 需求举例: 假如一所学校只有两个系, 每个系有两个专业, 每个专 ...
- (4.6)sql2008中的group by grouping sets
最近遇到一个情况,需要在内网系统中出一个统计报表.需要根据不同条件使用多个group by语句.需要将所有聚合的数据进行UNION操作来完成不同维度的统计查看. 直到发现在SQL SERVER 200 ...
- SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE
1.创建表 Staff CREATE TABLE [dbo].[Staff]( ,) NOT NULL, ) NULL, ) NULL, ) NULL, [Money] [int] NULL, [Cr ...
- [Oracle] Group By 语句的扩展 - Rollup、Cube和Grouping Sets
常常写SQL语句的人应该知道Group by语句的主要使用方法是进行分类汇总,以下是一种它最常见的使用方法(依据部门.职位分别统计业绩): SELECT a.dname,b.job,SUM(b.sal ...
随机推荐
- 通讯录C++console application
#include<iostream> #include<fstream> #include<string> #include<cstring> #inc ...
- IOS中TableView的使用(1) -创建一个简单的tableView
创建一个简单的tableView: #import <UIKit/UIKit.h> /*tableView 一定要遵守这两个协议: UITableViewDataSource,UITabl ...
- 20款最好的免费的IDES和编辑器
程序员编程利器:20款最好的免费的IDES和编辑器 Posted on 2015-02-17 21:52 尛鱼 阅读(170) 评论(1) 编辑 收藏 程序员编程利器:20款最好的免费的IDEs和编辑 ...
- JS操作cookie的实例
<script type="text/javascript"> //写cookies函数 function SetCookie(name, value)//两个参数,一 ...
- linux 安装httpd(验证通过)
一.安装apache(http服务) 1. 从apache.org下载源码安装包 2. 解压缩 # tar zxf httpd-2.2.4.tar.gz # cd httpd-2.2.4 3. 安装a ...
- Android利用CountDownTimer类实现倒计时功能
public class MainActivity extends Activity { private MyCount mc; private TextView tv; @Override publ ...
- 探究Java中Map类
Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map---实现Map Map.Entry--Map的内部 ...
- webkit的几个属性
-webkit-text-size-adjust 1.当样式表里font-size<12px时,中文版chrome浏览器里字体显示仍为12px,这时可以用 html{-webkit-text-s ...
- hdu2899 Strange fuction
在区间(0,100).在恒大二阶导数0.f(x)有极小值.用的最低要求的一阶导数值点: #include<math.h> #include<stdio.h> #include& ...
- 开源的.Net ORM微型框架SuperHelper
SuperHelper——灵活通用的.开源的.Net ORM微型框架 SuperHelper是博主利用业余时间编写的一个ORM微型框架,除了可以提高开发效率,与其它ORM框架相比,博主更加喜欢Supe ...