最近,在写存储过程的时候遇到一个问题,将数据分组统计时,需要显示全部数据和统计行像Excel表一样,而不是只显示统计数据。一开始想到了循环所有数据,然后统计,拼接的方式,但是实现起来比较麻烦,而且效率很低,通过查询发现了GROUP BY ROLLUP函数,能够解决问题,记录下来和大家分享,文笔和技术水平不高,旨在分享,欢迎指正!
1、创建表,插入数据
CREATE TABLE [dbo].[Table_1]( [Course] [varchar](50) NULL, [Name] [varchar](50) NULL, [Score] [int] NULL ) INSERT [dbo].[Table_1] ([Course], [Name], [Score]) VALUES (N'Math', N'A', 80) INSERT [dbo].[Table_1] ([Course], [Name], [Score]) VALUES (N'Math', N'B', 90) INSERT [dbo].[Table_1] ([Course], [Name], [Score]) VALUES (N'Math', N'C', 85) INSERT [dbo].[Table_1] ([Course], [Name], [Score]) VALUES (N'English', N'A', 81) INSERT [dbo].[Table_1] ([Course], [Name], [Score]) VALUES (N'English', N'B', 91) INSERT [dbo].[Table_1] ([Course], [Name], [Score]) VALUES (N'English', N'C', 86)
此表是学科(Course)、学生(Name)和成绩(Score)的关系表,结构比较随意,只是为了介绍ROLLUP功能。
2、一个字段分组
根据Course分组
SELECT [Course],SUM([Score]) AS TotalScore FROM [huo].[dbo].[Table_1] GROUP BY [Course]
使用ROLLUP根据Course分组
SELECT [Course],SUM([Score]) AS TotalScore FROM [huo].[dbo].[Table_1] GROUP BY ROLLUP([Course])
相比前者多了一行合计。
3、两个字段分组
根据Course和Name分组
SELECT [Course],[Name],SUM([Score]) AS TotalScore FROM [huo].[dbo].[Table_1] GROUP BY [Course],[Name]
使用ROLLUP根据Course和Name分组
SELECT [Course],[Name],SUM([Score]) AS TotalScore FROM [huo].[dbo].[Table_1] GROUP BY ROLLUP([Course],[Name])
相比前者多了三行合计,GROUP BY ROLLUP 是GROUP BY Course、GROUP BY (Course,Name)和GROUP BY NULL 三种情况的去重集合。
目前得到的结果集,经过处理就得到了想要的结果。