今天说一下 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

好~今天说道这里~祝各位元宵节阖家安康

时间: 2024-10-23 09:53:45

今天说一下 Group by 这个东西的相关文章

supervisor(一)基础篇

这两天干的活,是让楼主写一个supervisor的listener,用来监控supervisor所管理子进程的状态,当子进程异常退出时,楼主写的这个listener将会触发报警.在这里总结下supervisor的知识吧 先说说supervisor是干什么的吧? supervisor这东西,其实就是用来管理进程的.咱们为什么要用supervisor呢?因为,相对于我们linux传统的进程管理方式来说,它有很多的优势,要不然咱们也不会闲着没事去用supervisor了. OK,下面来看看superv

supervisor进程管理工具

先说说supervisor是干什么的吧? supervisor这东西,其实就是用来管理进程的.咱们为什么要用supervisor呢?因为,相对于我们linux传统的进程管理方式来说, 它有很多的优势,要不然咱们也不会闲着没事去用supervisor了. OK,下面来看看supervisor有哪些好处吧. 简单 为啥简单呢?因为咱们通常管理linux进程的时候,一般来说都需要自己编写一个能够实现进程start/stop/restart/reload功能的脚本, 然后丢到/etc/init.d/下面

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

今天博客的主题不是Alamofire, 而是iOS网络编程中经常使用的NSURLSession.如果你想看权威的NSURLSession的东西,那么就得去苹果官方的开发中心去看了,虽然是英文的,但是结合代码理解应该不难.更详细的信息请移步于苹果官方介绍URL Loading System,网上好多iOS网络编程的博客都翻译于此.因为目前iOS开发中,网络请求大部分使用NSURLSession,所以今天的博客我们就以NSURLSession展开.关于之前使用的NSURLConnection在此就不

supervisord 小记

此篇仅用作supervisord的用法,不涉及理论说明和基础介绍 supervisor(一)基础篇 使用supervisord来管理process 进程的守护神 - Supervisor supervisor 官方文档 First.安装与应用: 常见问题: Q1:http://127.0.0.1:8050 refused connection supervisord 问题描述:在执行supervisorctl status时,出现以上错误. 原因:supervisord未启动. 解决方案:启动s

Linux 进程管理与监控(supervise and monit)

一.Supervisor 1.安装 宿主机环境:( Centos 6.5 ) pip2.7 install supervisor 2.创建配置文件 通过 echo_supervisord_conf 命令来创建配置文件: echo_supervisord_conf >/etc/supervisord.conf 3.主配置文件基本参数 [unix_http_server] file=/var/run/supervisor/supervisor.sock chmod=0700 chown=www:ww

Supervisor 安装及配置管理uwsgi进程

Supervisor介绍 Supervisor 允许其用户在UNIX类操作系统上控制多个进程. 块如下: 方便 需要为每个进程实例编写rc.d脚本通常是不方便的. rc.d脚本是进程初始化/自动启动/管理的常用形式,但写入和维护可能会很痛苦.此外,rc.d脚本不能自动重新启动崩溃的进程,并且许多程序在崩溃时不会正常重新启动.Supervisord启动进程作为其子进程,并可以配置为在崩溃时自动重新启动它们.它也可以自动配置为在其自身的调用中启动进程. 准确性 在UNIX上的进程通常很难获得准确的上

CentOS7部署NET Core应用程序

1 将发布好的.net core 程序ftp上传到/home/netcore 目录 , 执行下面的命令 dotnet WebMVC.dll 2.测试程序是否运行正常 curl http://localhost:5000 3.配置nginx /etc/nginx/nginx.conf user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic mo

supervisor介绍与使用

Supervisor安装与配置(linux/unix进程管理工具) Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统.它可以很方便的监听.启动.停止.重启一个或多个进程.用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控

supervisor更改某项目配置后 需要重新启动才有效

一.原理 supervisor是所有项目的父进程: supervisor(pid=29208)会成为主进程,管理各个项目的进程. 当项目A(pid=11531)挂掉,supervisor根据设置autorestart.startretries是否重启. 若要重启,则会重启项目A(pid=13357), 若不重启,则项目A(pid=0). 当supervisor被kill,管理的项目全部死掉,重启supervisor(pid=14140),管理的项目都重启: supervisor是如何知道某项目挂