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. 值栈(Structs2)

    1. 关于值栈: 1). 登陆 时, ${userName} 读取 userName 值, 实际上该属性并不在 request 等域对象中, 而是从值栈中获取的. 2). ValueStack: I. ...

  2. 利用Canvas编辑图片

    使用<canvas>对象在浏览器中把一幅彩色图片变成灰度图片. grayscale.html <!DOCTYPE html> <html lang="en&qu ...

  3. Maven+SSM框架实现简单的增删改查

    Spring介绍: spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情.然而, Spring的用途不仅限于服务器端的开发.从简单性.可测试性和松耦合的角度而言,任何Ja ...

  4. redis持久化机制

    redis持久化 redis的数据存在内存中,所以存取性能好.但是存在内存中的数据存在一个问题,一旦机器重启,内存数据消失.为了解决这个问题,redis支持持久化.持久化就是为了解决内存数据丢失时恢复 ...

  5. NotSerializableException解决方法

    NotSerializableException 问题描述: 想要写入对象的时候的时候回抛出NotSerializableException:类名 原因: 写入的对象没有序列化,即没有实现java.i ...

  6. 分享5种风格的 jQuery 分页效果【附代码】

    jPaginate 是一款非常精致的分页插件,提供了五种不同风格的分页效果,支持鼠标悬停翻页,快速分页功能.这款插件还提供了丰富的配置选项,你可以根据需要进行设置. 效果演示      源码下载 各个 ...

  7. Koala – 开源的前端预处理器语言图形编译工具

    koala 是一个前端预处理器语言图形编译工具,支持 Less.Sass.Compass.CoffeeScript,帮助 Web 开发者更高效地使用它们进行开发.跨平台运行,完美兼容 Windows. ...

  8. 经典网页设计:20个华丽的 iPhone 应用程序演示网站

    一个物品销售很好,重要的原因之一是它的包装,因为这是最重要的细节,可以把一个人转变成购买者.一个好的包装设计和良好的表现比产品本身更重要,因此被分配了大量的金钱和资源,以创造伟大的东西. 因此,为了销 ...

  9. C#联合Union的实现方式

    一.基础篇 C#不像C++,他本身是没有联合Union的,但是可以通过手动控制结构体每个元素的位置来实现,这需要结合使用StructLayoutAttribute.LayoutKind以及FieldO ...

  10. Dotfuscator混淆加密

    混淆加密 1. 需要安装Dotfuscator软件 2. 安装好后打开软件,找到编译好的DLL文件 3. 打开[setting]设置属性,如下图: 把 Disable String Encryptio ...