数据分组、统计 case when then else end
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') >= #{dto.startTime}
</if>
<if test="dto.endTime != '' and dto.endTime != null">
and to_char(tdh.create,'yyyy-mm-dd') <= #{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的更多相关文章
- R语言︱数据分组统计函数族——apply族用法与心得
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:apply族功能强大,实用,可以代替 ...
- 数据分组统计函数族——apply族用法与心得
笔者寄语:apply族功能强大,实用,可以代替很多循环语句,R语言中不要轻易使用循环语句. 原文链接: https://blog.csdn.net/sinat_26917383/article/det ...
- mysql按天,小时,半小时,N分钟,分钟进行数据分组统计
转自:https://blog.csdn.net/u010946448/article/details/83752984#_75
- Dev用于界面按选中列进行分组统计数据源(实用技巧)
如果有用U8的可以明白这个功能就是模仿他的统计功能.我不过是把他造成通用的与适应于DEV的. (效率为6000条数据分组统计时间为3秒左右分组列过多5秒.1000条以下0.几秒,500条下0.00几秒 ...
- Python3-sqlalchemy-orm 分组统计
#-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...
- SQL 分组统计 行转列 CASE WHEN 的使用
原文地址:http://blog.itpub.net/26451903/viewspace-733526 原文在分组统计部分 sql是有问题的 本文已将sql改正 已用红色标记 Cas ...
- mysql按日期分组统计数据
最近在做一个招聘网时,需要显示一个月内企业招聘信息的发布数量,按日期分组统计,刚开始是直接从源数据库表里面进行group by,但这样子就出现日期不连续的问题了,我想要的效果是,若当天没有数据,则显示 ...
- 常用sql:按照表中的某一列对数据进行分组,统计数据条数
select FROM_UNIXTIME(start_time,'%Y-%m-%d')as date,COUNT(*) FROM random_num GROUP BY FROM_UNIXTIME(s ...
- 数据可视化之powerBI技巧(二十)采悟:创建度量值,轻松进行分组统计
上一篇文章中的分组,都是通过新建列的方式实现的,直观上比较容易理解.不过这样都修改了原始数据的结构,如果我们不在源表上进行修改,直接通过度量值的方式来进行分组,是否可以实现呢? 答案当然是肯定的. 采 ...
- sql 分组统计查询并横纵坐标转换
关于sql 分组统计查询,我们在做报表的时候经常需要用到;今天就在这里整理下; 先附上一段sql代码: if object_id(N'#mytb',N'U') is not null drop tab ...
随机推荐
- maven自动部署项目以及常见问题解决
Maven自动部署war到Tomcat1. 在maven项目的pom里配置如下信息 <build> <finalName>dianxiao</finalName> ...
- 自动化发布-GitLab WEB Hooks 配置
钩子(hooks) hooks是在特定事件发生之前或之后执行特定脚本代码功能(从概念上类比,就与监听事件.触发器之类的东西类似). Git hooks就是那些在Git执行特定事件(如commit.pu ...
- 详解 Java NIO
文件的抽象化表示,字节流以及字符流的文件操作等属于传统 IO 的相关内容,我们已经在前面的文章进行了较为深刻的学习了. 但是传统的 IO 流还是有很多缺陷的,尤其它的阻塞性加上磁盘读写本来就慢,会导致 ...
- 解决System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到的问题
这段时间写Android和IOS服务时 sql数据库查询有数据正常,没数据总是报异常:System.Data.SqlClient.SqlException (0x80131904): Timeout ...
- 如何为你的树莓派安装一个WIN10系统?(非iot)
Windows10 ARM版,是的,这次并非IoT版,而是功能与PC一致的ARM版.需要注意的是,这个方法并非官方提供的,可用性上会有一些坑,热衷于尝试的玩家可以一试! 准备项目:树莓派3B以上型号, ...
- C++桥接模式【转】
https://www.cnblogs.com/jiese/p/3164940.html 将抽象部份与它的实现部份分离,使它们都可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一,关键就是这个 ...
- SOA、SOAP、RFC、RPC、IETF
SOA: 全称:Servuce - oriented Architecture 说明:面向服务架构 就是说将软件按照功能设计成一个个服务,这些服务用标准的方式定义接口.并通过标准的协议进行调用. SO ...
- Python 简单的文件上传功能
简单地在程序当前目录下上传一张图片: 1.png 到程序的 yuan 文件夹下.这里使用的是固定参数 post,如果后期有需求,可以增加判断来更加完善程序. # server 端 import soc ...
- java.lang.IllegalArgumentException Expected MultipartHttpServletRequest
解决方案:检查jar包,完毕无误后在Spring MVC的配置文件中加入: <!-- 需要文件上传功能时,启用以下配置 设置最大上传文件大小 10M=10*1024*1024(B)=104857 ...
- jquery制作移动端菜单栏左右滑动
//菜单栏滑动function move_scollX(){ var startPosition, endPosition, distanceX,distanceY; $(".left&qu ...