SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,合计,小计
表结构:
CREATE TABLE [dbo].[Students](
[ID] [int] IDENTITY(1,1) NOT NULL,
[StudentName] [nvarchar](50) NULL,
[Sex] [int] NOT NULL,
[GradeName] [nvarchar](50) NULL,
[ClassName] [nvarchar](50) NULL,
[BodyWeight] [decimal](18, 2) NOT NULL,
[Area] [nvarchar](50) NULL,
CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO
测试数据:
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (1, N'张三', 1, N'高一', N'1班', CAST(140.00 AS Decimal(18, 2)), N'中国')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (2, N'李四', 1, N'高一', N'1班', CAST(140.00 AS Decimal(18, 2)), N'中国')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (3, N'王五', 1, N'高一', N'1班', CAST(155.00 AS Decimal(18, 2)), N'中国')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (4, N'奥巴马', 1, N'高一', N'2班', CAST(138.00 AS Decimal(18, 2)), N'美国')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (5, N'希拉里', 0, N'高一', N'2班', CAST(113.00 AS Decimal(18, 2)), N'美国')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (6, N'习XX', 1, N'高一', N'1班', CAST(110.00 AS Decimal(18, 2)), N'中国')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (7, N'温宝宝', 1, N'高一', N'1班', CAST(200.00 AS Decimal(18, 2)), N'中国')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (8, N'埃希', 0, N'高一', N'1班', CAST(123.00 AS Decimal(18, 2)), N'澳大利亚')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (9, N'卡特琳娜', 0, N'高二', N'1班', CAST(145.00 AS Decimal(18, 2)), N'澳大利亚')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (10, N'德玛西亚', 1, N'高二', N'2班', CAST(90.00 AS Decimal(18, 2)), N'英国')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (11, N'嘉文', 1, N'高二', N'2班', CAST(95.00 AS Decimal(18, 2)), N'英国')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (12, N'德邦', 1, N'高二', N'2班', CAST(102.00 AS Decimal(18, 2)), N'英国')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (13, N'蛮子', 1, N'高三', N'1班', CAST(160.00 AS Decimal(18, 2)), N'刚果')
INSERT [dbo].[Students] ([ID], [StudentName], [Sex], [GradeName], [ClassName], [BodyWeight], [Area]) VALUES (14, N'易大师', 1, N'高三', N'1班', CAST(120.00 AS Decimal(18, 2)), N'刚果')
情况一:只有一个分类统计列,只需要一个合计。只需要增加with rollup即可。

SELECT CASE WHEN GROUPING(GradeName)=1 THEN '合计' ELSE GradeName END AS 年级 ,
SUM(CASE WHEN Sex=1 THEN 1 ELSE 0 END) AS 男生数,
SUM(CASE WHEN Sex=0 THEN 1 ELSE 0 END) AS 女生数,
COUNT(Sex) AS 总数
FROM dbo.Students
GROUP BY GradeName WITH ROLLUP
ORDER BY GradeName DESC
情况二:有多个分类汇总列,只需要一个合计。增加rollup之后,需要使用GROUPING函数判断。
GROUPING函数 指示是否聚合 GROUP BY 列表中的指定列表达式。 在结果集中,如果 GROUPING 返回 1 则指示聚合;返回 0 则指示不聚合。 如果指定了 GROUP BY,则 GROUPING 只能用在 SELECT <select> 列表、HAVING 和 ORDER BY 子句中。

SELECT CASE WHEN GROUPING(GradeName)=1 THEN '合计' ELSE GradeName END AS 年级 ,
ClassName AS 班级 ,
SUM(CASE WHEN Sex=1 THEN 1 ELSE 0 END) AS 男生数,
SUM(CASE WHEN Sex=0 THEN 1 ELSE 0 END) AS 女生数,
COUNT(Sex) AS 总数
FROM dbo.Students
GROUP BY GradeName,ClassName WITH ROLLUP
HAVING GROUPING(GradeName)=1 OR GROUPING(ClassName)=0
ORDER BY GradeName DESC

SELECT CASE WHEN GROUPING(GradeName)=1 THEN '合计' ELSE GradeName END AS 年级 ,
ClassName AS 班级 ,
Area AS 地区 ,
SUM(CASE WHEN Sex=1 THEN 1 ELSE 0 END) AS 男生数,
SUM(CASE WHEN Sex=0 THEN 1 ELSE 0 END) AS 女生数,
COUNT(Sex) AS 总数
FROM dbo.Students
GROUP BY GradeName,ClassName,Area WITH ROLLUP
HAVING GROUPING(GradeName)=1 OR (GROUPING(ClassName)=0 AND GROUPING(Area) =0)
ORDER BY GradeName DESC
情况三:有多个分类汇总列,需要显示全部的合计和小计。不需要增加判断。

SELECT CASE WHEN GROUPING(GradeName)=1 THEN '合计' ELSE GradeName END AS 年级 ,
CASE WHEN GROUPING(GradeName)=0 AND GROUPING(ClassName)=1 THEN '小计' ELSE ClassName END AS 班级 ,
SUM(CASE WHEN Sex=1 THEN 1 ELSE 0 END) AS 男生数,
SUM(CASE WHEN Sex=0 THEN 1 ELSE 0 END) AS 女生数,
COUNT(Sex) AS 总数
FROM dbo.Students
GROUP BY GradeName,ClassName WITH ROLLUP
ORDER BY GradeName DESC
情况四:有多个分类汇总列,需要显示部分的合计和小计。增加rollup之后,需要增加判断

SELECT CASE WHEN GROUPING(GradeName)=1 THEN '年级合计' ELSE GradeName END AS 年级 ,
CASE WHEN GROUPING(GradeName)=0 AND GROUPING(ClassName)=1 THEN '班级小计' ELSE ClassName END AS 班级 ,
CASE WHEN GROUPING(ClassName)=0 AND GROUPING(Area)=1 THEN '地区小计' ELSE Area END AS 地区 ,
SUM(CASE WHEN Sex=1 THEN 1 ELSE 0 END) AS 男生数,
SUM(CASE WHEN Sex=0 THEN 1 ELSE 0 END) AS 女生数,
COUNT(Sex) AS 总数,
GROUPING(GradeName) AS GradeName_G,
GROUPING(ClassName) AS ClassName_G,
GROUPING(Area) AS Area_G
FROM dbo.Students
GROUP BY GradeName,ClassName,Area WITH ROLLUP
HAVING GROUPING(GradeName)=1 OR GROUPING(Area)=0 OR GROUPING(ClassName)=0
ORDER BY GradeName DESC
参考:
SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,合计,小计的更多相关文章
- SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,总计(合计),小计
版权声明:本文为博主原创文章,未经博主允许不得转载.本人观点或有不当之处,请在评论中及时指正,我会在第一时间内修改. https://blog.csdn.net/aiming66/article/de ...
- 常用sql:按照表中的某一列对数据进行分组,统计数据条数
select FROM_UNIXTIME(start_time,'%Y-%m-%d')as date,COUNT(*) FROM random_num GROUP BY FROM_UNIXTIME(s ...
- 【SQL】面面俱到 | 在SQL中使用CUBE和ROLLUP实现数据多维汇总
偶然在网上看到一篇文章,讲到数据汇总,提到了CUBE,感觉有些晦涩,想试着自己表述一下.同时,个人也认为CUBE还是很有用的,对SQL或数据分析感兴趣的小伙伴不妨了解一下,或许有用呢! 先设定个需求, ...
- C# Linq及Lamda表达式实战应用之 GroupBy 分组统计
在项目中做统计图表的时候,需要对查询出来的列表数据进行分组统计,首先想到的是避免频繁去操作数据库可以使用 Linq eg: //例如对列表中的Cu元素进行按年GroupBy分组统计 //包含年份,平均 ...
- Mysql按日、周、月进行分组统计
我们在用 Mysql 制作数据可视化图表时候,经常需要按照天.周.月等不同的粒度对数据进行分组统计.而我们的时间可能是 “2017/12/5 0:0:0” 这种准确的时间. 所以在进行分组之前我们需要 ...
- 用SQL实现统计报表中的"小计"与"合计"的方法详解
本篇文章是对使用SQL实现统计报表中的"小计"与"合计"的方法进行了详细的分析介绍,需要的朋友参考下 客户提出需求,针对某一列分组加上小计,合计汇总.网上找 ...
- oracle group by rollup实现小计、合计
SQL合计汇总实现数据N+1条显示: 注意group by rollup((ename, job, empno))!!! select decode(grouping(ename) + groupin ...
- ORACLE的分组统计之ROLLUP(一)
Oracle 9i以后,扩展了group by 的功能,能够满足大部分多维数据的分析统计功能,主要表现: 1. rollup,cube,grouping sets 扩展group by字句提供了丰富的 ...
- sql server 分组统计数据
说明:group by是sql中对数据表中的数据进行分组的,在select列表中出现的字段必须全部出现在group by 字段中,出现在聚合函数中的字段在group by中可有可无,没有出现在sele ...
随机推荐
- 【知识必备】内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye
一.写在前面 对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针:而对于java来说,就是new出来的Object放在Heap上无法被GC回收:而这里就把我之前的一篇内存泄漏的总 ...
- C++ std::set
std::set template < class T, // set::key_type/value_type class Compare = less<T>, // set::k ...
- [原创]mybatis中整合ehcache缓存框架的使用
mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...
- Redis/HBase/Tair比较
KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式 支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...
- python+uwsgi导致redis无法长链接引起性能下降问题记录
今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...
- Android 7.1 - App Shortcuts
Android 7.1 - App Shortcuts 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Shortcuts 文中如有纰漏,欢迎大家留言 ...
- 以项目谈WebGIS中Web制图的设计和实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景介绍 一般WebGIS项目中,前端展示数据的流程基本是先做数据入 ...
- go语言:多个[]byte数组合并成一个[]byte
场景:在开发中,要将多个[]byte数组合并成一个[]byte,初步实现思路如下: 1.获取多个[]byte长度 2.构造一个二维码数组 3.循环将[]byte拷贝到二维数组中 package gst ...
- linux下 lvm 磁盘扩容
打算给系统装一个oracle,发现磁盘空间不足.在安装系统的时候我选择的是自动分区,系统就会自动以LVM的方式分区.为了保证系统后期的可用性,建议所有新系统安装都采用LVM,之后生产上的设备我也打算这 ...
- Linux监控工具介绍系列——vmstat
说来惭愧,玩Linux这么久了,居然没有玩转vmstat这个命令,对很多指标的具体意义都有点模糊不清,花了点时间好好学习.整理一下这个命令的相关资料.因为这个命令确实比较重要,而且频繁用到. 命令 ...