前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >玩转数据库之 Group by Grouping

玩转数据库之 Group by Grouping

作者头像
lpxxn
发布2018-01-31 11:34:39
6610
发布2018-01-31 11:34:39
举报
文章被收录于专栏:技术之路技术之路

有的时候我们要从数据库里把数据组织成树结构再展现到页面上

像下面这样

今天我们用Group 和Grouping实现它,并总结一下它俩。

先看一下概念,再用代码一点一点去理解它们,最后我会给出完整的代码

Group By : 语句用于结合合计函数,根据一个或多个列对结果集进行分组。

Grouping :指示是否聚合 GROUP BY 列表中的指定列表达式。 在结果集中,如果 GROUPING 返回 1 则指示聚合;

                返回 0 则指示不聚合。 如果指定了 GROUP BY,则 GROUPING 只能用在 SELECT <select> 列表、HAVING 和 ORDER BY 子句中。

ROLLUP :生成简单的 GROUP BY 聚合行以及小计行或超聚合行,还生成一个总计行。

让我们先建一个数据库,并添加一些数据

代码语言:javascript
复制
use master  
go 
if exists(select 1 from sysdatabases where name ='MyGroupDB')
	ALTER DATABASE MyGroupDB SET SINGLE_USER with ROLLBACK IMMEDIATE  
	drop database MyGroupDB
go

create database MyGroupDB
go
use MyGroupDB
go

create Table Category
(
	Category_ID int identity(1,1),
	Category_Name varchar(100)
)
go
create Table Product
(
	Product_ID int identity(1,1),
	CategoryID int ,
	Product_Name varchar(100)
)
go
insert into Category values('手机')
insert into Category values('台式机')
insert into Category values('数码相机')
go

insert 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

看一下它们的数据

代码语言:javascript
复制
select *  
from Category 
left join Product on Category_ID = CategoryID

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

代码语言:javascript
复制
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 加上合计行

代码语言:javascript
复制
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  with rollup

我们看到了好多NULL数据,而且很有规律

这些规律我们可以用Grouping 看到

代码语言:javascript
复制
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_NameGP
from Category 
left join Product on Category_ID = CategoryID
group by Category_ID ,Category_Name,CategoryID,Product_Name with rollup

 你会发现那些Null值就是Grouping 为1的时候

最后一行的合计是Categrory_ID的,我们不需要,CategoryID的合计我们也不需要我们要怎么去掉它们呢,在having 里

代码语言:javascript
复制
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_NameGP
from Category 
left join Product on Category_ID = CategoryID
group by Category_ID ,Category_Name,CategoryID,Product_Name with rollup
having GROUPING(Category_ID)=0  and GROUPING(CategoryID)=0 

这样的结果 我们看到只有Product_Name的Grouping有为1 了

我们就是用它去实现这棵树

代码语言:javascript
复制
select 
case 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_Name
from Category 
left join Product on Category_ID = CategoryID
group by Category_ID ,Category_Name,CategoryID,Product_Name with rollup
having GROUPING(Category_ID)=0  and GROUPING(CategoryID)=0 
order by Category_ID ,Product_Name

下面是完整的代码

代码语言:javascript
复制
use master  
go 
if exists(select 1 from sysdatabases where name ='MyGroupDB')
	ALTER DATABASE MyGroupDB SET SINGLE_USER with ROLLBACK IMMEDIATE  
	drop database MyGroupDB
go

create database MyGroupDB
go
use MyGroupDB
go

create Table Category
(
	Category_ID int identity(1,1),
	Category_Name varchar(100)
)
go
create Table Product
(
	Product_ID int identity(1,1),
	CategoryID int ,
	Product_Name varchar(100)
)
go
insert into Category values('手机')
insert into Category values('台式机')
insert into Category values('数码相机')
go

insert 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
--------------------------------------------------------

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  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_NameGP
from Category 
left join Product on Category_ID = CategoryID
group 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_NameGP
from Category 
left join Product on Category_ID = CategoryID
group by Category_ID ,Category_Name,CategoryID,Product_Name with rollup
having GROUPING(Category_ID)=0  and GROUPING(CategoryID)=0 

-------------------------

select 
case 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_Name
from Category 
left join Product on Category_ID = CategoryID
group by Category_ID ,Category_Name,CategoryID,Product_Name with rollup
having GROUPING(Category_ID)=0  and GROUPING(CategoryID)=0 
order by Category_ID ,Product_Name
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-09-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档