case when 对表进行条件分组

case简单函数 case   age  when   then

select name , sex , age , (

case age

/*when 条件成立显示then中内容 then 成立是显示  else 不成立显示 end*/

when age = 18 then '成年人' else '未成年' end

when age = 30 then '而立之年' else '小伙子' end

) 身份   /*列名*/

from user

name      sex     age         身份

张三         男       19         成年人

李四        男       30        而立之年

case 搜索函数 case when then

SELECT COUNT((
            CASE
            WHEN condition = ''   THEN condition
            ELSE NULL
            END

)) col1 ,             //根据condition 分组,并统计condition = ''出现的次数
            COUNT((
            CASE
            WHEN condition = ''   THEN condition
            ELSE NULL
            END

)) col2 ,
            count(id) count
            FROM  table

有如下需求:
  表A中有很多条数据, 每条数据拥有一个状态字段,现在需要统计不同状态的数据有多少条.

查询出来的结果如下形式:

status1  status2   status3  count
   2             3            3          8

   SELECT COUNT((
CASE
WHEN STATUS = 'status1'
THEN STATUS
ELSE NULL
END))status1,
COUNT((
CASE
WHEN STATUS = 'status2'
THEN STATUS
ELSE NULL
END))status2,
COUNT((
CASE
WHEN STATUS = 'status3'
THEN STATUS
ELSE NULL
END))status3,
count(table.id) count
FROM table

需求是:根据t_dev表找出其中所有记录在t_history和t_history_details两张表中存储的告警原因统计,

即根据不同原因(tdhd.cause)字段进行统计,统计出各种类型原因的个数,在这个基础上关联其他几张表找出其他必须的信息

首先根据总表找出关联表内必须的数据:

select tsd.id device_id,NVL(tui.unit_name,tbi.build_name) place_name,
alarmCount.TEMPERATURE,alarmCount.EXCESSIVE,alarmCount.VOLTAGE,alarmCount.total
from t_dev tsd
join t_fire tef on tef.id = tsd.id and tsd.status = 'VALID'
join t_unit tui on tui.id = tsd.unit_id
join t_build tbi on tbi.id = tsd.place_id
<where>
查找条件;
</where>

接着:使用上面提到的case when 方法进行数据统计

SELECT COUNT((
CASE
WHEN tdhd.alarm_cause = 'TEMPERATURE' THEN tdhd.cause
ELSE NULL
END
)) TEMPERATURE ,
COUNT((
CASE
WHEN tdhd.alarm_cause = 'EXCESSIVE' THEN tdhd.cause
ELSE NULL
END
)) EXCESSIVE ,
COUNT((
CASE
WHEN tdhd.alarm_cause = 'VOLTAGE' THEN tdhd.cause
ELSE NULL
END
)) VOLTAGE ,
count(tdh.dev_id) total
from t_history tdh
join t_history_details tdhd on tdhd.dev_history_id = tdh.id
where 统计条件

然后将统计出来的数据当成一张临时表,关联进第一步的sql中, 在这里有个问题, 关联表需要关联条件,这里的条件是统计出来的数据的有个dev_id字段相同,

所以需要在统计sql中将dev_id查询出来, 自然就想到了group by,使用dev_id分组,这样每组统计都有对应的dev_id,然后就可以将两个sql关联起来了

以下是最终结果

select tsd.id device_id,NVL(tui.unit_name,tbi.build_name) place_name,
alarmCount.TEMPERATURE,alarmCount.EXCESSIVE,alarmCount.VOLTAGE,alarmCount.total
from t_dev tsd
join t_fire tef on tef.id = tsd.id and tsd.status = 'VALID'
join t_unit tui on tui.id = tsd.unit_id
join t_build tbi on tbi.id = tsd.place_id
join (SELECT COUNT((
CASE
WHEN tdhd.alarm_cause = 'TEMPERATURE' THEN tdhd.cause
ELSE NULL
END
)) TEMPERATURE ,
COUNT((
CASE
WHEN tdhd.alarm_cause = 'EXCESSIVE' THEN tdhd.cause
ELSE NULL
END
)) EXCESSIVE ,
COUNT((
CASE
WHEN tdhd.alarm_cause = 'VOLTAGE' THEN tdhd.cause
ELSE NULL
END
)) VOLTAGE ,
count(tdh.dev_id) total,
tdh.dev_id
from t_history tdh
join t_history_details tdhd on tdhd.dev_history_id = tdh.id
<where>
<if test="dto.startTime != '' and dto.startTime != null">
and to_char(tdh.create,'yyyy-mm-dd') &gt;= #{dto.startTime}
</if>
<if test="dto.endTime != '' and dto.endTime != null">
and to_char(tdh.create,'yyyy-mm-dd') &lt;= #{dto.endTime}
</if>
</where>
group by tdh.dev_id <!--分组,获取dev_id-->
) alarmCount on alarmCount.dev_id = tef.id
<where>
<if test="dto.placeName != '' and dto.placeName != null">
and (tbi.build LIKE '%'||#{dto.placeName}||'%' or tui.unit like '%'||#{dto.placeName}||'%')
</if>
</where>

数据分组、统计 case when then else end的更多相关文章

  1. R语言︱数据分组统计函数族——apply族用法与心得

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:apply族功能强大,实用,可以代替 ...

  2. 数据分组统计函数族——apply族用法与心得

    笔者寄语:apply族功能强大,实用,可以代替很多循环语句,R语言中不要轻易使用循环语句. 原文链接: https://blog.csdn.net/sinat_26917383/article/det ...

  3. mysql按天,小时,半小时,N分钟,分钟进行数据分组统计

    转自:https://blog.csdn.net/u010946448/article/details/83752984#_75

  4. Dev用于界面按选中列进行分组统计数据源(实用技巧)

    如果有用U8的可以明白这个功能就是模仿他的统计功能.我不过是把他造成通用的与适应于DEV的. (效率为6000条数据分组统计时间为3秒左右分组列过多5秒.1000条以下0.几秒,500条下0.00几秒 ...

  5. Python3-sqlalchemy-orm 分组统计

    #-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...

  6. SQL 分组统计 行转列 CASE WHEN 的使用

    原文地址:http://blog.itpub.net/26451903/viewspace-733526 原文在分组统计部分  sql是有问题的     本文已将sql改正   已用红色标记  Cas ...

  7. mysql按日期分组统计数据

    最近在做一个招聘网时,需要显示一个月内企业招聘信息的发布数量,按日期分组统计,刚开始是直接从源数据库表里面进行group by,但这样子就出现日期不连续的问题了,我想要的效果是,若当天没有数据,则显示 ...

  8. 常用sql:按照表中的某一列对数据进行分组,统计数据条数

    select FROM_UNIXTIME(start_time,'%Y-%m-%d')as date,COUNT(*) FROM random_num GROUP BY FROM_UNIXTIME(s ...

  9. 数据可视化之powerBI技巧(二十)采悟:创建度量值,轻松进行分组统计

    上一篇文章中的分组,都是通过新建列的方式实现的,直观上比较容易理解.不过这样都修改了原始数据的结构,如果我们不在源表上进行修改,直接通过度量值的方式来进行分组,是否可以实现呢? 答案当然是肯定的. 采 ...

  10. sql 分组统计查询并横纵坐标转换

    关于sql 分组统计查询,我们在做报表的时候经常需要用到;今天就在这里整理下; 先附上一段sql代码: if object_id(N'#mytb',N'U') is not null drop tab ...

随机推荐

  1. SQL 必知必会·笔记<16>使用视图

    1.视图 视图是虚拟的表.与包含数据的表不一样,视图只包含使用时动态检索数据的查询. 为什么使用视图 重用SQL 语句 简化复杂的SQL 操作.在编写查询后,可以方便地重用它而不必知道其基本查询细节 ...

  2. 如何在Lua与C/C++之间实现table数据的交换

    之前在<C/C++和Lua是如何进行通信的?>一文中简单的介绍了lua与宿主之间的通信.简单的说两种不同的语言之间数据类型不一样又如何进行数据交换呢?那就是lua_State虚拟栈,通过栈 ...

  3. jquery根据name属性查找元素

    $("div[id]") //选择所有含有id属性的div元素 $("input[name='newsletter']") //选择所有的name属性等于'ne ...

  4. OOP 面向对象的理解

    概念 面向对象编程(OOP)是一种编程语言模型,围绕对象是行为.数据.逻辑. 从历史上看,程序被视为一种逻辑程序,它接收输入数据,处理数据并生成输出数据. 基础 面向对象的3大核心思想:封装.继承.多 ...

  5. [javaEE] HTTP协议总结

    OSI网络7层协议 物理层 ==> 数据链路层 ==> 网络层ip ==> 传输层 TCP UDP ==>会话层 ==>表示层 ==> 应用层 HTTP FTP S ...

  6. 【Java】HashMap源码分析——常用方法详解

    上一篇介绍了HashMap的基本概念,这一篇着重介绍HasHMap中的一些常用方法:put()get()**resize()** 首先介绍resize()这个方法,在我看来这是HashMap中一个非常 ...

  7. switch case语句中能否作用在String,long上

    在之前的eclipse中使用switch的case语句时是只能为(byte,short,char)int类型或枚举类型.但在jdk1.7以后 在case语句中是可以使用String 以及long 等类 ...

  8. UserControl VS TemplatedControl

    一:首先来看一下UserControl 熟悉XAML的朋友们都知道,当我们创建一个用户控件的时候,VS会自动为我们生成一个XXX.xaml文件和XXX..xaml.cs文件,XAML文件用于进行控件的 ...

  9. 支持开源,推动Orchard

    希望正在研究果园,和对果园感兴趣的,加入Orchard高级开发群,进行交流和讨论及深入研究Orchard开发,我们致力寻求志同道合推动Orchard发展的屌丝!!! 干净.专注.社区力量的圈子

  10. pygame中模块说明

    参考博客:https://blog.csdn.net/qq_27717921/article/details/53231762 pygame模块概览 1.display模块 功能:生成windows窗 ...