今天同事遇到问题,帮看问题的时候,我发现他写的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. 怎么形容智能冰激凌机器人_一种人机交互型冰激凌多功能自动售卖机器人的制作方法...
  2. windows下db2数据库的卸载
  3. 正则在开发过程中的妙用
  4. mysql反向生成uml类图_UML类图自动生成,太爽了
  5. rub、sass和compass的安装
  6. 使用bat来运行cygwin,执行脚本(命令)
  7. 【CodeForces - 312C】The Closest Pair (思维)
  8. springboot jar中没有主清单属性_Spring Boot 常见错误及解决方法
  9. jq ajax traditional,jQuery ajax - param() 方法
  10. mysql主从复制实践之单数据库多实例
  11. Codeforces Gym101518H:No Smoking, Please(最小割)
  12. CNN发展历史【从LeNet到DenseNet】
  13. vuex commit 模块_Vuex详细介绍
  14. 《机器学习实战》代码实现学习一 使用K-近邻算法改进约会网站的配对效果(数据准备)...
  15. OpenGL学习笔记一
  16. java使用itextpdf生成 pdf (支持table)分页
  17. virtualbox 菜单栏不见了
  18. JVM从入门到入魔(一) 类加载机制
  19. 应用StarRocks实现存储引擎的收敛,保障高查询并发及低延迟要求
  20. 感悟员工和公司之间的情感关系

热门文章

  1. 给到工作的你诗和远方~
  2. 进制转换:十进制转六进制/转八进制
  3. 星河万里 一路“童”行
  4. js屏蔽键盘esc键
  5. 江苏辖区农商银行2020年(科技类)
  6. 实操石英钟改5V充电器供电
  7. DSL 领域特定语言
  8. php获取小米手环数据,小米运动App数据提取
  9. word 添加批注 标题向右移动 解决方法
  10. 01、uniapp连接MUMU模拟器