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. 【随笔】nginx add_header指令的使用

    nginx配置文件通过使用add_header指令来设置response header. 具体方法如下: add_header key value add_header Cache-Control n ...

  2. 和我一起打造个简单搜索之Logstash实时同步建立索引

    用过 Solr 的朋友都知道,Solr 可以直接在配置文件中配置数据库连接从而完成索引的同步创建,但是 ElasticSearch 本身并不具备这样的功能,那如何建立索引呢?方法其实很多,可以使用 J ...

  3. 【详解】Spring Security 之 SecurityContext

    前言 本文主要整理一下SecurityContext的存储方式. SecurityContext接口 顾名思义,安全上下文.即存储认证授权的相关信息,实际上就是存储"当前用户"账号 ...

  4. CynosDB技术详解——存储集群管理

    本文由腾讯云数据库发表 前言 CynosDB是架构在CynosFS之上的分布式关系数据库系统,为最大化利用存储资源,平衡资源之间的竞争,检查资源使用情况,需要一套高效稳定的分布式集群管理系统(SCM: ...

  5. 图像边缘检测——几种图像边缘检测算子的学习及python 实现

    本文学习利用python学习边缘检测的滤波器,首先读入的图片代码如下: import cv2 from pylab import * saber = cv2.imread("construc ...

  6. JavaWeb学习(二十三)———Filter(过滤器)

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  7. msql 必知必会笔记

    Edit Mysql 必知必会 第一章 理解SQL 什么是数据库 数据库(database) 保存有组织的数据的容器 什么是表  一组特定类型的数据的结构化清单 什么是模式  数据库和表的布局及特性的 ...

  8. sql多条件查询语句

    如上图:三个文本可选项,那sql语句怎么写呢? 1.首先获取三个文本的值分别为Name,Age,Sex. 2.string sql="select * from 表 where 1=1&qu ...

  9. this引用逃逸

    1.什么是This逃逸? 在构造器构造还未彻底完成前(即实例初始化阶段还未完成),将自身this引用向外抛出并被其他线程复制(访问)了该引用,可能会问到该还未被初始化的变量,甚至可能会造成更大严重的问 ...

  10. DotNetCore学习-3.管道中间件

    中间件是用于组成应用程序管道来处理请求和响应的组件.管道内的每个组件都可以选择是否将请求交给下一个组件,并在管道中调用下一个组件之前和之后执行一些操作. 请求委托被用来建立请求管道,并处理每一个HTT ...