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 这个东西的更多相关文章

  1. iOS开发之Alamofire源码解析前奏--NSURLSession全家桶

    今天博客的主题不是Alamofire, 而是iOS网络编程中经常使用的NSURLSession.如果你想看权威的NSURLSession的东西,那么就得去苹果官方的开发中心去看了,虽然是英文的,但是结 ...

  2. python supervisor使用

    Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上.Supervisor 官方版目前只能运行在 Python 2 ...

  3. supervisor-1:基础篇

    别人博客转载,做个记录 原文链接:http://lixcto.blog.51cto.com/4834175/1539136 有阵子没写博客了,这段时间一直在研究python django框架和前端相关 ...

  4. supervisord 小记

    此篇仅用作supervisord的用法,不涉及理论说明和基础介绍 supervisor(一)基础篇 使用supervisord来管理process 进程的守护神 - Supervisor superv ...

  5. supervisor(一)基础篇

    这两天干的活,是让楼主写一个supervisor的listener,用来监控supervisor所管理子进程的状态,当子进程异常退出时,楼主写的这个listener将会触发报警.在这里总结下super ...

  6. supervisor配置文件详解

    介绍 Supervisor是一个进程控制系统. 它是一个C/S系统(注意: 其提供WEB接口给用户查询和控制), 它允许用户去监控和控制在类UNIX系统的进程. 它的目标与launchd, daemo ...

  7. Supervisor 安装及配置管理uwsgi进程

    Supervisor介绍 Supervisor 允许其用户在UNIX类操作系统上控制多个进程. 块如下: 方便 需要为每个进程实例编写rc.d脚本通常是不方便的. rc.d脚本是进程初始化/自动启动/ ...

  8. Perl获取主机名、用户、组、网络信息

    获取主机名.用户.组.网络信息相关函数 首先是获取主机名的方式,Perl提供了Sys::Hostname模块,可以查询当前的主机名: use Sys::Hostname; print hostname ...

  9. supervisor配置详解(转)

    有阵子没写博客了,这段时间一直在研究python django框架和前端相关的东西.楼主学通信的,对web这一块啥也不懂,学了一个礼拜django,接着学了2个礼拜前端,感觉还是做不出来一个好看的页面 ...

随机推荐

  1. eclipse的快捷操作(转)

    快捷键命令作用 快捷键序列 保存 Ctrl+S 刷新 F5 关闭 Ctrl+W 属性 Alt+Enter Format Ctrl+Shift+F 删除行 Ctrl+D 在当前行上面插入行 Ctrl+S ...

  2. Maven搭建SpringMVC+Mybatis项目详解

    前言 最近比较闲,复习搭建一下项目,这次主要使用spring+SpringMVC+Mybatis.项目持久层使用Mybatis3,控制层使用SpringMVC4.1,使用Spring4.1管理控制器, ...

  3. php ci 2.0框架 ORM

    很早知道ci出了2.0版本了.这几天正好有项目要用ci开发 虽然项目不大.不过也从开发项目的过程中熟悉了CI框架 因为是个电商项目 本来想用个YII2 的. 封装的虽然厉害不过功能强大 因为另个兄弟坚 ...

  4. js的动态加载、缓存、更新以及复用(四)

    本来想一气呵成,把加载的过程都写了,但是卡着呢,所以只好在分成两份了. 1.页面里使用<script>来加载 boot.js . 2.然后在boot.js里面动态加载 bootLoad.j ...

  5. bootstrap源码分析之form、navbar

    一.表单(Form) 源码文件:_form.scssmixins/_form.scss 1.按层次结构分:form-group -> form-control/input-group/form- ...

  6. browser.html – HTML 实现 Firefox UI

    browser.html 是一个实验性的项目,用于证明一个概念:使用 HTML 重新实现 Firefox UI ,并作为一个应用程序.它是基于浏览器的 API ,并以浏览器的方式和系统的应用工作.即使 ...

  7. 经典!HTML5 Canvas 模拟可撕裂布料效果

    这是一个模拟可撕裂布料效果的 HTML5 Canvas 应用演示,效果逼真.你会看到,借助 Canvas 的强大绘图和动画功能,只需很少的代码就能实现让您屏息凝神的效果. 温馨提示:为保证最佳的效果, ...

  8. JS判断是否是数字

    function isNumber(value) { var patrn = /^[0-9]*$/; if (patrn.exec(value) == null || value == "& ...

  9. .net弹出框

    弹出框可以使用div来显示在前台增加 <div id="flowDiv" runat="server"> <div class="r ...

  10. READ TABLE ..... BINARY SEARCH问题

    Read Table 的语法很多,这里说一种特殊情况,Read Table 中查询的时候对标准内表经常有一种二分优化查找,用Binary search的时候首先必须要有查询条件:但如果查询条件满足的项 ...