SQL Server 查询数据并汇总相关技巧 23.08.08

GROUPING

是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。

仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择列表中才允许分组。

语法

GROUPING ( column_name )

参数

column_name

是 GROUP BY 子句中用于检查 CUBE 或 ROLLUP 空值的列。

返回类型

int

sql 复制代码
--首先创建测试表、添加数据
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)

select *from #t

--情况一:只有一个分类汇总列时,只需要一个合计。只需要增加with rollup即可
select case when grouping(a)=1 then '合计' else cast(a as varchar) end a,
sum(b),sum(c),sum(d),sum(e) from #t group by a with rollup
sql 复制代码
--情况二:有多个分类汇总列,只需要一个合计.增加rollup之后,需要增加判断。
select case when grouping(a)=1 then '合计' else cast(a as varchar) end 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 varchar) end a,
    b,
    c,
sum(d),sum(e) from #t
group by a,b,c with rollup
having grouping(c)=0 or grouping(a)=1
sql 复制代码
--情况三:有多个分类汇总列,需要全部的小计和合计。
select case when grouping(a)=1 then '合计' else cast(a as varchar) end a,
    case when grouping(b)=1 and grouping(a)=0 then '小计' else cast(b as varchar) end b,
    case when grouping(c)=1 and grouping(b)=0 then '小计' else cast(c as varchar) end 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 varchar) end a,
    case when grouping(b)=0 and grouping(c)=1
    then cast(b as varchar)+'小计' else cast(b as varchar) end b,
    case when grouping(c)=1 and grouping(b)=0
    then '' else cast(c as varchar) end c,
sum(d),sum(e) from #t
group by a,b,c with rollup
sql 复制代码
--情况四:有多个分类汇总列,需要部分的小计和合计
select case when grouping(a)=1 then '合计' else cast(a as varchar) end a,
    b,
    case when grouping(c)=1 and grouping(b)=0 then '小计' else cast(c as varchar) end 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 varchar) end a,
    case when grouping(b)=1 and grouping(a)=0 then '小计' else cast(b as varchar) end 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
相关推荐
打码人的日常分享6 分钟前
智能制造数字化工厂解决方案
数据库·安全·web安全·云计算·制造
三水不滴10 分钟前
Redis 过期删除与内存淘汰机制
数据库·经验分享·redis·笔记·后端·缓存
-孤存-1 小时前
MyBatis数据库配置与SQL操作全解析
数据库·mybatis
2301_822366352 小时前
使用Scikit-learn构建你的第一个机器学习模型
jvm·数据库·python
万邦科技Lafite3 小时前
一键获取京东商品评论信息,item_reviewAPI接口指南
java·服务器·数据库·开放api·淘宝开放平台·京东开放平台
自可乐3 小时前
Milvus向量数据库/RAG基础设施学习教程
数据库·人工智能·python·milvus
weixin_307779134 小时前
C#实现两个DocumentDB实例之间同步数据
开发语言·数据库·c#·云计算
盒马coding4 小时前
深度解密MySQL2PG工具MySQL至PostgreSQL语法全景拆解过程
数据库·mysql·postgresql
tb_first4 小时前
万字超详细苍穹外卖学习笔记2
java·jvm·数据库·spring·tomcat·maven
Nandeska4 小时前
13、MySQL半同步复制示例
数据库·mysql