`
Everyday都不同
  • 浏览: 713461 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

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

阅读更多

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

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

   字段: id  A   B    condition2

SELECT 
  COUNT(1) cnt,
  A,
  B
FROM
  tablename 
WHERE 1 = 1 
  AND B LIKE '201602%'
GROUP BY A,
  B
ORDER BY A,
  B

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

SELECT 
  COUNT(1) cnt,
  A,
  B
FROM
  tablename 
WHERE 1 = 1 
  AND B LIKE '201602%'
  AND condition = '1'
GROUP BY A,
  B
ORDER 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函数结合起来:

 

ELECT 
  COUNT(1) cnt,
  COUNT(
    CASE
      WHEN condition = '1' 
      THEN 1 
      ELSE NULL 
    END
  ) cnt1,
  COUNT(
    CASE
      WHEN condition = '2' 
      THEN 1 
      ELSE NULL 
    END
  ) cnt2,
  COUNT(
    CASE
      WHEN condition = '3' 
      THEN 1 
      ELSE NULL 
    END
  ) cnt3,
  A,
  B
FROM
  tablename
WHERE 1 = 1 
  AND B LIKE '201602%'
GROUP BY A,
  B
ORDER 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语句哦。比如需要在一条记录里「同时统计出总人数,男生人数和女生人数~~~

  • 大小: 9 KB
分享到:
评论

相关推荐

    SQL一条语句统计记录总数及各状态数

    方法一、 代码如下:SELECT SUM(正确数)+SUM(错误数) AS 总记录数,SUM(正确数)... 代码如下:select count(1)总记录数,sum(case when status=1 then 1 else 0 end)正确数,sum(case when status=0 then 1 else 0 end) 错

    sql统计类查询语句

    sum(case when level='一级' then 1 else 0 end) as 一级, sum(case when level='二级' then 1 else 0 end) as 二级, sum(case when level='三级' then 1 else 0 end) as 三级 from table group by type

    50个常用SQL语句,很好

    ,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数 FROM SC T,Course where t.C#=course.C# GROUP BY t.C# ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ...

    经典SQL语句大全

    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type 显示结果: type ...

    django-conditional-aggregates:Django聚合可有条件运行的函数(即生成SQL`CASE`语句)

    Django条件聚集 (由于旧版SQLCompiler类的限制,无法使用Django ... CASE WHEN ( stats_stat . stat_type = a AND stats_stat . event_type = v ) THEN stats_stat . count ELSE 0 END ) AS impressions FROM

    超实用sql语句

    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type 显示结果: type ...

    经典全面的SQL语句大全

    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type  显示结果: type ...

    Oracle事例

    当指定时,如果父表中的记录被删除,则依赖于父表的记录也被删除 REFERENCE 表名() on delete cascade; 7、删除带约束的表 Drop table 表名 cascade constraints; 8:索引管理 <1>.creating function-based...

    一个用来统计相同姓名人数的SQl语句

    3 2 1 1,4,9 王四 2 1 1 2,7 丽丽 1 0 1 3 高洁 2 1 1 6,8 赵柳 1 1 0 5 代码如下: SELECT * FROM (SELECT DISTINCT Name,Count(ID) as 人員個數, sum(case when Sex=’男’ then 1 else 0 end) as 男人

    数据库操作语句大全(sql)

    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type 显示结果: type ...

    sql经典语句一部分

    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type 显示结果: type ...

    mysql数据库的基本操作语法

    自动:当表上定义主键约束、唯一、外键约束时,该表会被系统自动添加上索引。 手动:手动在相关表或列上增加索引,提高查询速度。 删除索引方式: 自动:当表对象被删除时,该表上的索引自动被删除 手动:手动删除...

    精髓Oralcle讲课笔记

    ------------------------/组函数(共5个):将多个条件组合到一起最后只产生一个数据------min() max() avg() sum() count()----------------------------/ 51、select count(*) from emp; --求出表中一共有多少条...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    注意:当用特权用户登录时,必须带上sysdba或sysoper 例子: 普通用户登录 sys用户登录 操作系统的身份登录 2. 连接命令(conn) 说明:用于连接到oracle数据库,也可实现用户的切换 用法:conn 用户名/密码 [as...

    世界杯猜想活动的各类榜单的SQL语句小结

    /*增幅降幅排名*/ 代码如下: Select top 50 UserName,sum(ReceivePrice) – sum(GuessPrice) as ReceivePrice, cast(sum(CASE WHEN ReceivePrice>0 THEN 1.0 ELSE 0 END) / count(ReceivePrice) * 100 as numeric(4,...

    SQL sever 实训

    --对销售表ProOut的SaleDate 列进行约束,当不输入值时,系统默认其值为系统当前日期 CREATE DEFAULT Today AS GETDATEA() GO /*ALTER TABLE ProOut ADD CONSTRAINT DF_ProOut_SaleDate DEFAULT('当前日期')FOR ...

    SQL培训第一期

    在create table语句中可以根据应用要求,定义属性以及元组上的约束。 常见的用户定义的完整性约束有: not null或null约束。 unique约束:唯一性约束。 default约束:默认值约束。 check约束:检查约束,check约束...

Global site tag (gtag.js) - Google Analytics