SQL Server WITH ROLLUP、WITH CUBE、GROUPING语句的应用
CUBE:CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
ROLLUP:ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
GROUPING:当行由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 1;当行不由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 0。
先创建一个临时表:
create table #temp
(
姓名 varchar(50) not null,
课程 varchar(50) null,
分数 int null
) insert into #temp
select '小红','SQL','' union
select '小红','C#','' union
select '小明','SQL','' union
select '小明','C#','' union
select '小李','SQL','' union
select '小李','C#',null select * from #temp

WITH CUBE:
select 姓名,课程,sum(分数)
from #temp
group by 姓名,课程
with cube

先以姓名分组和课程组合,再以姓名和课程分组进行组合。
PS:分类依据并不是根据select 中的顺序,而是根据group by中的顺序。
下面换个顺序看看结果:
select 姓名,课程,sum(分数)
from #temp
group by 课程,姓名
with cube

先以课程分组和姓名组合,再以课程和姓名分组进行组合。
CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
WITH ROLLUP:
select 姓名,课程,sum(分数)
from #temp
group by 姓名,课程
with rollup

select 姓名,课程,sum(分数)
from #temp
group by 课程,姓名
with rollup

ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
那么这个某一层次结构是什么呢?看一下上面的数据,当以姓名先分组时,分成了三组(不计最后一行合计),当以课程先分组时,分成了两组(不计最后一行合计)。
这个某一层次结构我猜想应该跟 group by 的分组顺序有关。
GROUPING:
grouping 与 with rollup 的结合(与with cube的结合是一样的)
select 姓名,课程,sum(分数),GROUPING(姓名)
from #temp
group by 姓名,课程
with rollup

当 grouping 指定列为【姓名】时,只有最后一行是 with rollup 所添加的。
select 姓名,课程,sum(分数),GROUPING(课程)
from #temp
group by 姓名,课程
with rollup

当 grouping 指定列为【课程】时,第三行、第六行、第九行和最后一行是 with rollup 所添加的。
当行由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 1;当行不由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 0。
select 姓名,
case when GROUPING(姓名)=1
then '总计'
else
case when GROUPING(课程)=1
then '小计'
else 课程 end
end 课程,
sum(分数)
from #temp
group by 姓名,课程
with rollup

SQL Server WITH ROLLUP、WITH CUBE、GROUPING语句的应用的更多相关文章
- SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE
1.创建表 Staff CREATE TABLE [dbo].[Staff]( ,) NOT NULL, ) NULL, ) NULL, ) NULL, [Money] [int] NULL, [Cr ...
- SQL SERVER全面优化-------写出好语句是习惯
前几篇文章已经从整体提供了诊断数据库的各个方面问题的基本思路...也许对你很有用,也许你觉得离自己太远.那么今天我们从语句的一些优化写法及一些简单优化方法做一个介绍.这对于很多开发人员来说还是很有用的 ...
- SQL Server(三):Select语句
1.最基本的Select语句: Select [Top n [With Ties]] <*|Column_Name [As <Alias>][, ...n]> From & ...
- SQL Server 查询、搜索命令、语句
--查询所有表 SELECT NAME,* FROM SYSOBJECTS WHERE XTYPE='U' order by SYSOBJECTS.name --查询所有存储过程 select * f ...
- SQL Server 找出值得优化的语句
方法 1. sys.dm_exec_qurey_stats 返回 SQL Server 中缓存查询计划的聚合性能统计信息. 缓存计划中的每个查询语句在该视图中对应一行, 并且行的生存期与计划本身相关联 ...
- 不同数据库oracle mysql SQL Server DB2 infomix sybase分页查询语句
在不同数据库中的使用的分页查询语句: 当前页:currentpage 页大小:pagesize 1. Oracle数据库 select * from (select A.*,rownum rn fro ...
- 如何在SQL Server 2008下轻松调试T-SQL语句和存储过程
一.回顾早期的SQL SERVER版本:早在SQL Server 2000时代,查询分析器的功能还很简陋,远不如VS那么强大.到SQL Server 2005时代,代码高亮.SQL优化等功能逐渐加强, ...
- 从零开始学习SQL SERVER(2)--- 基本操作及语句
声明:仅为本人随笔及经验之谈,有错误敬请指出. # 后的文字为注释 Microsoft SQL Server Management Studio 中的SQL命令 添加数据库 1 CREATE DATA ...
- sql server抓取表结构的语句
sql server 2008抓取方法: --------------------------------------- SELECT 表名 = Case When A.colorder ...
随机推荐
- 【UVa】Partitioning by Palindromes(dp)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=27&page=sh ...
- php7垃圾回收分析
- datatable详解(angular-datatable)+后台分页(springmvc)
datable常规配置,百度一大堆 function prepareDatatable(selector, options) { var defaultOptions = { autoWidth: t ...
- iOS 关于 UIKit 专栏应该写在最前面的话
iOS 关于 UIKit 应该写在最前面的话 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协 ...
- cocos2d-x 3.0 使用.plist图片集方法
这个贴.仅仅是为了和我一样的新手,更快的索引. 我使用的是SpritePacker 软件来制作 .plist SpriteFrameCache *frameCache = SpriteFrameCac ...
- vue的递归组件以及三级菜单的制作
js里面有递归算法,同时,我们也可以利用props来实现vue模板的递归调用,但是前提是组件拥有 name 属性 父组件:slotDemo.vue: <template> <div& ...
- 2D绘图引擎比较
这个问题很普遍.最近在研究这个问题,在网上搜了一些资料,再结合自己的经验,谈谈自己的一些想法. 一.双缓存能提高绘图效率吗? 网上有篇文章:绘图效率完整解决方案——三种手段提高GDI/GDI+绘图效率 ...
- 以打字形式展示placeholder的插件
http://weber.pub/以打字形式展示placeholder的插件/197.html
- .NET 4.0 中的契约式编程
契约式编程不是一门崭新的编程方法论.C/C++ 时代早已有之.Microsoft 在 .NET 4.0 中正式引入契约式编程库.博主以为契约式编程是一种相当不错的编程思想,每一个开发人员都应该掌握.它 ...
- 《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者链与触摸事件
原创文章,欢迎转载.转载请注明:关东升的博客 应用与用户进行交互,依赖于各种各样的事件.事件响应者对象是可以响应事件并对其进行处理的对象,响应者链是由一系列链接在一起的响应者组成的.响应者链在事件处理 ...