表结构:

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

参考:

使用ROLLUP 汇总数据

GROUPING

SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,合计,小计的更多相关文章

  1. SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,总计(合计),小计

    版权声明:本文为博主原创文章,未经博主允许不得转载.本人观点或有不当之处,请在评论中及时指正,我会在第一时间内修改. https://blog.csdn.net/aiming66/article/de ...

  2. 常用sql:按照表中的某一列对数据进行分组,统计数据条数

    select FROM_UNIXTIME(start_time,'%Y-%m-%d')as date,COUNT(*) FROM random_num GROUP BY FROM_UNIXTIME(s ...

  3. 【SQL】面面俱到 | 在SQL中使用CUBE和ROLLUP实现数据多维汇总

    偶然在网上看到一篇文章,讲到数据汇总,提到了CUBE,感觉有些晦涩,想试着自己表述一下.同时,个人也认为CUBE还是很有用的,对SQL或数据分析感兴趣的小伙伴不妨了解一下,或许有用呢! 先设定个需求, ...

  4. C# Linq及Lamda表达式实战应用之 GroupBy 分组统计

    在项目中做统计图表的时候,需要对查询出来的列表数据进行分组统计,首先想到的是避免频繁去操作数据库可以使用 Linq eg: //例如对列表中的Cu元素进行按年GroupBy分组统计 //包含年份,平均 ...

  5. Mysql按日、周、月进行分组统计

    我们在用 Mysql 制作数据可视化图表时候,经常需要按照天.周.月等不同的粒度对数据进行分组统计.而我们的时间可能是 “2017/12/5 0:0:0” 这种准确的时间. 所以在进行分组之前我们需要 ...

  6. 用SQL实现统计报表中的"小计"与"合计"的方法详解

    本篇文章是对使用SQL实现统计报表中的"小计"与"合计"的方法进行了详细的分析介绍,需要的朋友参考下   客户提出需求,针对某一列分组加上小计,合计汇总.网上找 ...

  7. oracle group by rollup实现小计、合计

    SQL合计汇总实现数据N+1条显示: 注意group by rollup((ename, job, empno))!!! select decode(grouping(ename) + groupin ...

  8. ORACLE的分组统计之ROLLUP(一)

    Oracle 9i以后,扩展了group by 的功能,能够满足大部分多维数据的分析统计功能,主要表现: 1. rollup,cube,grouping sets 扩展group by字句提供了丰富的 ...

  9. sql server 分组统计数据

    说明:group by是sql中对数据表中的数据进行分组的,在select列表中出现的字段必须全部出现在group by 字段中,出现在聚合函数中的字段在group by中可有可无,没有出现在sele ...

随机推荐

  1. 线性判别分析LDA原理总结

    在主成分分析(PCA)原理总结中,我们对降维算法PCA做了总结.这里我们就对另外一种经典的降维方法线性判别分析(Linear Discriminant Analysis, 以下简称LDA)做一个总结. ...

  2. URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  3. [C#] 软硬结合第二篇——酷我音乐盒的逆天玩法

    1.灵感来源: LZ是纯宅男,一天从早上8:00起一直要呆在电脑旁到晚上12:00左右吧~平时也没人来闲聊几句,刷空间暑假也没啥动态,听音乐吧...~有些确实不好听,于是就不得不打断手头的工作去点击下 ...

  4. CSS 3学习——文本效果和@font-face

    文本效果 关于文本效果,这里仅仅记录得到大多数浏览器支持的几个属性,分别是: text-overflow text-shadow word-break word-wrap text-overflow ...

  5. iosselect:一个js picker项目,在H5中实现IOS的select下拉框效果

    具体文档和demo可以访问github:https://github.com/zhoushengmufc/iosselect 移动端浏览器对于select的展示样式是不一致的,ios下是类似原生的pi ...

  6. [转载]敏捷开发之Scrum扫盲篇

    现在敏捷开发是越来越火了,人人都在谈敏捷,人人都在学习Scrum和XP...      为了不落后他人,于是我也开始学习Scrum,今天主要是对我最近阅读的相关资料,根据自己的理解,用自己的话来讲述S ...

  7. 敏捷测试模式之Scrum及其实践

    一.    敏捷开发模式简介 敏捷是近年来软件研发领域很火的一个词,采用敏捷开发模式的研发团队是越来越多了,尤其是敏捷模式中的Scrum更是佼佼者大行其道,这表明敏捷模式确有其好处,能给企业带来效率的 ...

  8. 《月之猎人 (Moon Hunters)》主角设计

    原文链接 游戏开发人员,你们好! 我是 Kitfox Games 工作室的总监 Tanya,我们的工作室位于加拿大的蒙特利尔,拥有六名员工. 我们 3 月份发布了<月之猎人>游戏的桌面版, ...

  9. fhq treap最终模板

    新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...

  10. Firefox开发者专版浏览器,Web开发者利器.

    2015的11月9日,Firefox迎来了自己的十周岁生日.在庆祝Firefox十周年之际,Mozilla发布了Firefox开发者专版,这是首款专门为开发者打造的浏览器. 浏览器中独特的暗色调设计. ...