今天同事遇到问题,帮看问题的时候,我发现他写的sql好厉害啊,我都没有接触过,自己平常用的都是一些增删改查以及一些简单函数的操作。哈哈,又学一招,记录一下。

我需要按2个维度来分组,求出按这2个维度分组的总数情况(count),但同时也需要在这2个维度下求出按不同条件得出的总数,这些不同条件下分别得出的总数相加的和即为不加上条件的情况下的总数。比如:

假设有一张tablename表格,数据结构如下:

字段: id  A   B    condition2

SELECTCOUNT(1) cnt,A,BFROMtablenameWHERE 1 = 1AND B LIKE '201602%'GROUP BY A,BORDER BY A,B

这是从tablename表中取出一定条件下按A,B分组的总数情况,假设现在我B的条件不变,需要统计根据condition字段(假设condition是一个枚举值的字段,即它的取值为1,2,3三种可能)来变化的总数,那么我需要分别写几个sql:

 SELECTCOUNT(1) cnt,A,BFROMtablenameWHERE 1 = 1AND B LIKE '201602%'AND condition = '1'GROUP BY A,BORDER BY A,B

这里的count统计条件是AND condition = '1' 还有可能是AND condition = '2'和AND condition = '3',然后这些不同的condition取值条件下的count统计取值分别为cnt1 cnt2 cnt3  则cnt1 + cnt2 + cnt3 = cnt(不加上condition过滤条件时的统计值).

问题来了,如何在一条记录里同时把cnt和cnt1-cnt3都展示出来呢?

之前我是先求出cnt的集合,再循环每一条记录,根据每条记录的A,B和condition取值去得到该条记录加上condition后对应的cnt,但后来发现这是十分不可取的,因为每条记录都得连接数据库去执行sql查询,显得效率低下。。

后来发现在这种情形下,case when then else end就可以起作用,但十分神奇的是,他竟然也能够和count函数结合起来:

SELECTCOUNT(1) cnt,COUNT(CASEWHEN condition = '1'THEN 1ELSE NULLEND) cnt1,COUNT(CASEWHEN condition = '2'THEN 1ELSE NULLEND) cnt2,COUNT(CASEWHEN condition = '3'THEN 1ELSE NULLEND) cnt3,A,BFROMtablenameWHERE 1 = 1AND B LIKE '201602%'GROUP BY A,BORDER BY A,B

这里需要注意count函数里面包围case when then else end的用法;还有一点需注意的是:count(null)得到的是0,这表明不符合当前条件下,走的是else null 这时候count(null)就为0啦~~,即不在当前条件下统计,否则count(1)就是统计了!!!

很神奇吧!看看结果:

多仔细几条记录,会发现每条记录都同时包含了cnt 和cnt1-cnt3,并且cnt = cnt1 + cnt2 + cnt3. 这说明我们这句sql求出的记录是正确的!

补充,同理的还有sum函数包围case when then else end,需注意不满足当前条件走else分支时,是要这样写的,sum(case when condition='1' then val else 0 end),即sum(0)才是0.

小结下:sum(0) = 0 , count(null) = 0.  在遇到这种情形的统计时,可考虑case when then else end语句哦。比如需要在一条记录里「同时」统计出总人数,男生人数和女生人数。

当case when then else end 语句遇上sum或count等统计函数相关推荐

  1. case when then else end 语句遇上sum或count等统计函数的注意事项(列转行)

    这里需要注意count函数里面包围case when then else end的用法:还有一点需注意的是:count(null)得到的是0,这表明不符合当前条件下,走的是else null 这时候c ...

  2. php case 多个条件判断语句,PHP switch case语句

    PHP 中的条件控制语句有两个,一个是 if else 语句,另一个是 switch case 语句.上节讲解了 if else,本节接着讲解 switch case 语句. switch 语句类似具 ...

  3. 当网络安全遇上大数据分析(9)

    2012年3月份,Gartner发表过一篇报告--Information Security Is Becoming a Big Data Analytics Problem .里面主要就讲到了针对大规 ...

  4. sql加上唯一索引后批量插入_MySQL当批量插入遇上唯一索引

    一.背景 以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表 ...

  5. 当async/await遇上forEach

    当async/await遇上forEach 当async/await遇到forEach会有什么反应呢? 这篇文章为你揭晓. 当async/await遇上forEach 前情提要 这是在做格式化wang ...

  6. 透过IL看C# (1)——switch语句(上)

    透过IL看C# (1) switch语句(上) 原文地址:http://www.cnblogs.com/AndersLiu/archive/2008/11/03/csharp-via-il-switc ...

  7. sql加上唯一索引后批量插入_MySQL批量插入遇上唯一索引避免方法

    一.背景 以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表 ...

  8. 当SWOOLE遇上PROTOCOL

    前言 上回我们简单介绍了一下TCP Server的工作方式以及如何用Swoole实现一个简单的TCP Server,这次我们来聊聊信息流动中,非常重要基石之一--协议(PROTOCOL). 协议,通信 ...

  9. [当人工智能遇上安全] 5.基于机器学习算法的主机恶意代码识别研究

    您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...

最新文章

  1. android 带边框的圆角按钮
  2. puppet cron 模块
  3. Node.js中文件上传与multer模块的应用
  4. 数字发行:电子书、电影、游戏、音乐
  5. DNS 截持模拟及环境搭建
  6. windows和Linux内存的对齐方式
  7. C语言僵尸进程,C/C++网络编程8——多进程服务器端之销毁僵尸进程
  8. 如何ASP.NET Core Razor中处理Ajax请求
  9. oracle dg 搭建方式,Linux平台 Oracle 11g DG测试环境快速搭建参考
  10. 正则表达式基础知识(转)
  11. [JSOI2009]瓶子和燃料【数论】
  12. idc机房运维巡检_技本功|数据安全之IDC数据容灾设计实现
  13. 2000-2020年中国地面气象数据:从NOAA到分省面板
  14. 影创SDK☀️四、开发注意事项
  15. iOS小技能:SKU视图搭建
  16. python:ImportError: cannot import name ‘xx‘ from ‘xxxx‘
  17. 复数java实验_java实验 复数
  18. Java——Jsoup方式的IP代理服务器的使用
  19. 开关电源空载吱吱声_开关电源变压器工作时为什么出现吱吱声?
  20. 09-微服务版的单点登陆系统设计及实现(2105~2106)

热门文章

  1. 12、第三课---C++单位换算
  2. 前后端交互,密码加密,RSA 实现前端 js 加密,后端 go 解密
  3. Julia数据可视化:Gadfly.jl包的使用
  4. Java - JIT即时编译器
  5. 干掉Session?这个跨域认证解决方案真的优雅
  6. git HEAD切换
  7. Python Pygame制作简单五子棋游戏(详细代码+解释)
  8. java qq聊天界面_【附源码】用Java写了一个类QQ界面聊天小项目,可在线聊天!...
  9. 【CXY】JAVA基础 之 Collections
  10. 积水成渊之python——os.path.join()