惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
WordPress大学
WordPress大学
Vercel News
Vercel News
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
I
InfoQ
小众软件
小众软件
Recent Announcements
Recent Announcements
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
大猫的无限游戏
大猫的无限游戏
美团技术团队
T
The Blog of Author Tim Ferriss
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
MongoDB | Blog
MongoDB | Blog
V
V2EX
J
Java Code Geeks
有赞技术团队
有赞技术团队
博客园 - 聂微东
B
Blog RSS Feed
博客园 - 司徒正美

博客园 - 一味

[翻译]实例:在Android调用WCF服务 基于LRU淘汰的高性能缓存 不是架构的架构之五:业务层的实现与自动代理(补充) 不是架构的架构之四:业务层的实现与自动代理 不是架构的架构之三:系统基础(2)主键选择和并发 不是架构的架构之二:系统基础(1) 不是架构的架构之一:总体思路 一道算法题 技术先行or业务先行 用了一年的键盘,记录下键盘磨损的状况 一个业务系统设计构想(一) 安装VS2008/.Net3.5/.Net3.0/.Net2.0sp1失败的解决办法 常用存储过程4(K310。3版本获取物流新单据的编码) 常用存储过程3(获取编码的上级编码和短编码) 常用存储过程2(获取编码级次) 常用存储过程1(获取字符串中的第一个数值) Math.Round函数四舍五入的问题 SQL Server进程阻塞的检查和解决办法(转自好友Blog) 学习NHibernate的感悟和疑惑
SQL Server中Rollup关键字使用技巧
一味 · 2007-11-12 · via 博客园 - 一味

首先创建测试表、添加数据。

create table #t(a int,b int,c int,d int,e int)
insert into #t values(1,2,3,4,5)
insert into #t values(1,2,3,4,6)
insert into #t values(1,2,3,4,7)
insert into #t values(1,2,3,4,8)
insert into #t values(1,3,3,4,5)
insert into #t values(1,3,3,4,6)
insert into #t values(1,3,3,4,8)
insert into #t values(1,3,3,4,7)

insert into #t values(2,2,2,4,5)
insert into #t values(2,2,3,4,6)
insert into #t values(2,2,4,4,7)
insert into #t values(2,2,5,4,8)
insert into #t values(2,3,6,4,5)
insert into #t values(2,3,3,4,6)
insert into #t values(2,3,3,4,8)
insert into #t values(2,3,3,4,7)

情况一:只有一个分类汇总列时,只需要一个合计。只需要增加with rollup即可。

select case when grouping(a)=1 then '合计' else cast(a as varcharend a,
sum(b),sum(c),sum(d),sum(e) from #t group by a with rollup


情况二:有多个分类汇总列,只需要一个合计.增加rollup之后,需要增加判断。

select case when grouping(a)=1 then '合计' else cast(a as varcharend a,
    b,
sum(c),sum(d),sum(e) from #t 
group by a,b with rollup 
having grouping(b)=0 or grouping(a)=1

select case when grouping(a)=1 then '合计' else cast(a as varcharend a,
    b,
    c,
sum(d),sum(e) from #t 
group by a,b,c with rollup 
having grouping(c)=0 or grouping(a)=1


情况三:有多个分类汇总列,需要全部的小计和合计

select case when grouping(a)=1 then '合计' else cast(a as varcharend a,
    
case when grouping(b)=1 and grouping(a)=0 then '小计' else cast(b as varcharend b,
    
case when grouping(c)=1 and grouping(b)=0 then '小计' else cast(c as varcharend c,
sum(d),sum(e) from #t 
group by a,b,c with rollup 


另外一种显示小计的方式

select case when grouping(a)=1 then '合计' 
    
when grouping(b)=1 then cast(a as varchar)+'小计'
    
else cast(a as varcharend a,
    
case when grouping(b)=0 and grouping(c)=1 
    
then cast(b as varchar)+'小计' else cast(b as varcharend b,
    
case when grouping(c)=1 and grouping(b)=0 
    
then '' else cast(c as varcharend c,
sum(d),sum(e) from #t 
group by a,b,c with rollup 

情况四:有多个分类汇总列,需要部分的小计和合计

select case when grouping(a)=1 then '合计' else cast(a as varcharend a,
    b,
    
case when grouping(c)=1 and grouping(b)=0 then '小计' else cast(c as varcharend c,
sum(d),sum(e) from #t 
group by a,b,c with rollup 
having grouping(a)=1 or grouping(b)=0

select case when grouping(a)=1 then '合计' else cast(a as varcharend a,
    
case when grouping(b)=1 and grouping(a)=0 then '小计' else cast(b as varcharend b,
    c,
sum(d),sum(e) from #t 
group by a,b,c with rollup 
having grouping(a)=1 or grouping(b)=1 or grouping(c)=0