数据分组、统计 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 ...
随机推荐
- 为什么byte的取值范围是-128到127
一个byte由八个位组成,如00000000,其中,符号位+数值位,前7位表示数值,第8位是符号位(0为正,1为负).这样+1就是00000001,-1就是10000001.最大的正数就是0 1111 ...
- php中 ord() 和 chr() 处理 utf8 字符串
ord() : 将字符转为 ascii 码 (0-256),准确定义官方文档:http://php.net/manual/en/function.ord.php chr() : 将 ascii 码转 ...
- 完整的一次 HTTP 请求响应过程(二)
上篇文章 我们完整的描述了计算机五层模型中的『应用层』和『运输层』,阐述了较为复杂的 TCP 协议的相关原理,相信大家一定也有所收获,那么本篇将继续五层模型的学习. 网络层 『网络层』其实解决的就是一 ...
- 获取微信的access_tokey,处理json格式的数据
#region 获取微信凭证 public string GetAccessToken(string wechat_id) { string accessToken = ""; D ...
- LinQ是什么?
•LINQ(发音:Link)是语言级集成查询(Language INtegrated Query) •LINQ是一种用来进行数据访问的编程模型,使得.NET语言可以直接支持数据查询 •LINQ的目标是 ...
- SQL查询语句如何能够让指定的记录排在最后
方法如下:select * from <表名> order by case when <条件> then 1 else 0 end asc 举例:把threads表中列id值小 ...
- Archlinux/Manjaro使用笔记-安装配置搜狗输入法步骤
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.安装qtwebkit-bin软件包解决qtwebkit无法编译安装问题 aurman -S qtwebkit-bin 二.安 ...
- Python shelve
shelve模块只有一个open函数,返回类似字典的对象,可读可写; key必须为字符串,而值可以是python所支持的数据类型. import shelve f = shelve.open('SHE ...
- Python hashlib 模块
使用 md5 加密 import hashlib m = hashlib.md5() m.update('hello world'.encode('utf-8')) # 加密的字符串需要先编码成 ut ...
- MySQL and Sql Server:Getting metadata using sql script (SQL-92 standard)
MySQL: use sakila; -- show fields from table_name; -- show keys from table_name; SELECT `REFERENCED_ ...