今天说一下 Group by 这个东西
group by 这个关键字,这个语句太平凡了~基本上只要有报表的地方,就会有它的身影。
常规用法就是
INSERT INTO #TypeValue
( TypeID, Col2 )
VALUES (1 , N'名称1'),(1 , N'名称2'),(2 , N'名称3'),(2, N'名称3'),(3 , N'名称4'),(3 , N'名称5'),(4 , N'名称6'),(4 , N'名称6'),(5 , N'名称7') SELECT TypeID,Col2,COUNT(*) AS Qty
FROM #TypeValue
GROUP BY TypeID,Col2 TypeID Col2 Qty
----------- -------------------------------------------------- -----------
1 名称1 1
1 名称2 1
2 名称3 2
3 名称4 1
3 名称5 1
4 名称6 2
5 名称7 1
一个语法原则就是,除非用到聚合的关键字或者常量(比如 count啊,sum啊,AVG啊之类的),其它出现的字段都必须出现在 group by 之后,并且不能用别名,就比如随便改一下上面那个句子,这里面只能把整个case 放到group by 里面,而并不能直接group by DisplayName 。就是这个道理
SELECT TypeID,CASE WHEN Col2 IN ('名称1','名称2') THEN 1
WHEN Col2 IN ('名称3','名称4') THEN 2
WHEN Col2 IN ('名称5','名称6') THEN 3
ELSE 4 END AS DisplayName,COUNT(*) AS Qty
FROM #TypeValue
GROUP BY TypeID,CASE WHEN Col2 IN ('名称1','名称2') THEN 1
WHEN Col2 IN ('名称3','名称4') THEN 2
WHEN Col2 IN ('名称5','名称6') THEN 3
ELSE 4 END
还有一个不大规范的用法 Group By ALL 这个用法,在未来的版本应该会废除,但是废除之前呢~还是可以用的(只是一般不建议),我也介绍一下。这个All 的场景很简单,就是在查询聚合的时候。在where 的限定条件里面过滤了一部分的数据。但是对于聚合的行数是没有任何的影响的,看个实例你就会明白
SELECT TypeID,Col2,COUNT(*) AS Qty
FROM #TypeValue
WHERE TypeID < 4
GROUP BY TypeID,Col2 TypeID Col2 Qty
----------- -------------------------------------------------- -----------
1 名称1 1
1 名称2 1
2 名称3 2
3 名称4 1
3 名称5 1 SELECT TypeID,Col2,COUNT(*) AS Qty
FROM #TypeValue
WHERE TypeID < 4
GROUP BY ALL TypeID,Col2 TypeID Col2 Qty
----------- -------------------------------------------------- -----------
1 名称1 1
1 名称2 1
2 名称3 2
3 名称4 1
3 名称5 1
4 名称6 0
5 名称7 0
第一个语句在查询出来的结果,字节把TypeID >=4 的,直接就不返回了。而第二个语句,TypeID >= 4 的,还留下个框架在。这个就是加了 All 关键字的影响。
还有一些可能用到的.比方说cube 。效果就是在group by 的每一项,从右到左都生成一个聚合行。简单举例又来改一下我们例子的语句。当中有些Null的行,对!就是聚合出来的啦~最后还有一个全部的总聚合╮(╯_╰)╭
SELECT TypeID,Col2,COUNT(*) AS Qty
FROM #TypeValue
GROUP BY ROLLUP (TypeID,Col2)
TypeID Col2 Qty
----------- -------------------------------------------------- -----------
1 名称1 1
1 名称2 1
1 NULL 2
2 名称3 2
2 NULL 2
3 名称4 1
3 名称5 1
3 NULL 2
4 名称6 2
4 NULL 2
5 名称7 1
5 NULL 1
NULL NULL 9
当然罗,有的伙伴说,然而我只需要你把总数聚合出来就ok啦!其它结果集臣妾不需要啊!OK啊,改下就行了啊~需要的是将 Rollup后面的子集用 () 包起来,因为这里面是判断集合的~so ~就行了,还有一个 ,当使用rollup 的时候,会有一个Grouping的行数标志是否是rollup 产生的聚合行~如果需要对聚合行赋值~注意数据类型的转换哦~
SELECT CASE WHEN GROUPING(TypeID) = 1 THEN '合计' ELSE RTRIM(TypeID) END AS TypeID,
Col2,COUNT(*) AS Qty
FROM #TypeValue
GROUP BY ROLLUP ((TypeID,Col2)) TypeID Col2 Qty
------------ -------------------------------------------------- -----------
1 名称1 1
1 名称2 1
2 名称3 2
3 名称4 1
3 名称5 1
4 名称6 2
5 名称7 1
合计 NULL 9
好~今天说道这里~祝各位元宵节阖家安康
今天说一下 Group by 这个东西的更多相关文章
- iOS开发之Alamofire源码解析前奏--NSURLSession全家桶
今天博客的主题不是Alamofire, 而是iOS网络编程中经常使用的NSURLSession.如果你想看权威的NSURLSession的东西,那么就得去苹果官方的开发中心去看了,虽然是英文的,但是结 ...
- python supervisor使用
Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上.Supervisor 官方版目前只能运行在 Python 2 ...
- supervisor-1:基础篇
别人博客转载,做个记录 原文链接:http://lixcto.blog.51cto.com/4834175/1539136 有阵子没写博客了,这段时间一直在研究python django框架和前端相关 ...
- supervisord 小记
此篇仅用作supervisord的用法,不涉及理论说明和基础介绍 supervisor(一)基础篇 使用supervisord来管理process 进程的守护神 - Supervisor superv ...
- supervisor(一)基础篇
这两天干的活,是让楼主写一个supervisor的listener,用来监控supervisor所管理子进程的状态,当子进程异常退出时,楼主写的这个listener将会触发报警.在这里总结下super ...
- supervisor配置文件详解
介绍 Supervisor是一个进程控制系统. 它是一个C/S系统(注意: 其提供WEB接口给用户查询和控制), 它允许用户去监控和控制在类UNIX系统的进程. 它的目标与launchd, daemo ...
- Supervisor 安装及配置管理uwsgi进程
Supervisor介绍 Supervisor 允许其用户在UNIX类操作系统上控制多个进程. 块如下: 方便 需要为每个进程实例编写rc.d脚本通常是不方便的. rc.d脚本是进程初始化/自动启动/ ...
- Perl获取主机名、用户、组、网络信息
获取主机名.用户.组.网络信息相关函数 首先是获取主机名的方式,Perl提供了Sys::Hostname模块,可以查询当前的主机名: use Sys::Hostname; print hostname ...
- supervisor配置详解(转)
有阵子没写博客了,这段时间一直在研究python django框架和前端相关的东西.楼主学通信的,对web这一块啥也不懂,学了一个礼拜django,接着学了2个礼拜前端,感觉还是做不出来一个好看的页面 ...
随机推荐
- 关于OpenCart的一个小建议
OpenCart是一套老牌的开源自由B2C电商系统,最近watch了其托管在在github上的项目,发现还是很活跃的,每天都有人反馈bug. 初步的看一下,它是支持在后台管理多个店铺的,而且可以同一个 ...
- Scalaz(55)- scalaz-stream: fs2-基础介绍,fs2 stream transformation
fs2是scalaz-stream的最新版本,沿用了scalaz-stream被动式(pull model)数据流原理但采用了全新的实现方法.fs2比较scalaz-stream而言具备了:更精简的基 ...
- linux下使用forever进行管理
何为forever:forever可以看做是一个nodejs的守护进程,能够启动,停止,重启我们的app应用.官方的说明是说:A simple CLI tool for ensuring that a ...
- Java新集合示意图
Java的新集合实际上只有3个集合组件:①Map ②List ③Set 在Java 1.2后应该尽量避免使用Hashtable,Vector 和Stack: 假如在一个列表中部进行大量的插入和删除操作 ...
- Nodejs与ES6系列4:ES6中的类
ES6中的类 4.1.class基本语法 在之前的javascript语法中是不存在class这样的概念,如果要通过构造函数生成一个新对象代码 function Shape(width,height) ...
- jQuery Wookmark Load 瀑布流布局实例演示
瀑布流布局非常适合大量图片的展示,一改过去裁剪图片尺寸统一的排版,每张图片都能完全展示,并错落有致,让人眼前一亮. 版本: jQuery v1.4.3+ jQuery Wookmark Load v1 ...
- Method Draw – 很好用的 SVG 在线编辑器
Method Draw 是一款在线 SVG 编辑器,是 SVG Edit 的一个分支.Method Draw 的目的是改进 SVG Edit 的可用性和用户体验.它移除了 line-caps/corn ...
- JavaScript中对象的比较
Javascript中有'=='和'==='两种相等比较,后者是全等,会判断数据类型,前者是相等,在比较时,会发生隐式转换. 如果将两个对象做'=='比较,结果会如何呢? 比如有如下两个对象: var ...
- Android UX & UI 最佳实践: 设计有效的导航
Best Practices for User Experience & UI Designing Effective Navigation 导航:帮助用户有效直观地使用你的应用. Plann ...
- APP One Link ,android and ios qrcode merge as One QRCode and one short link
Adroid and ios qrcode merge as One QRCode and one short link is publish , the web site is www.appone ...