mysql中行列转换(mysql 行列转换的示例代码)
类别:数据库 浏览量:397
时间:2021-10-21 07:09:41 mysql中行列转换
mysql 行列转换的示例代码一、需求
我们有三张表,我们需要分类统计一段时间内抗生素的不同药敏结果,即 report_item_drugs 表的 drugs_result, 在不同项目project_name 和不同抗生素 antibiotic_dict_name 下的占比,并将药敏结果显示在行上,效果如下:
三张原始表(仅取需要的字段示例),分别是:
报告表
项目表
抗生素表(药敏结果drugs_result为一列值)
二、实现
1、按照项目、抗生素分组求出检出的总数
|
select a.project_name,a.antibiotic_dict_name, sum (nums) as 检出总数 from ( select i.project_name,d.antibiotic_dict_name,d.drugs_result, count (d.id) as nums from `report` r right join report_item i on r.id=i.report_id right join report_item_drugs d on d.report_item_id=i.id where r.report_status=2 and r.add_date between '2020-01-01' and '2020-12-30' group by i.project_id,d.antibiotic_dict_id,d.drugs_result ) a group by a.project_name,a.antibiotic_dict_name |
2、按照项目、抗生素、药敏结果求出不同药敏结果数量
|
select i.project_name,d.antibiotic_dict_name,if(d.drugs_result<> '' , d.drugs_result, '未填写' ) as drugs_result, count (d.id) as 数量 from `report` r right join report_item i on r.id=i.report_id right join report_item_drugs d on d.report_item_id=i.id where r.report_status=2 and r.add_date between '2020-01-01' and '2020-12-30' group by i.project_id,d.antibiotic_dict_id,d.drugs_result |
3、将两个结果关联到一起
|
select bb.project_name,bb.antibiotic_dict_name,bb.drugs_result,bb.`数量`,aa.`检出总数` from ( select a.project_name,a.antibiotic_dict_name, sum (nums) as 检出总数 from ( select i.project_name,d.antibiotic_dict_name,d.drugs_result, count (d.id) as nums from `report` r right join report_item i on r.id=i.report_id right join report_item_drugs d on d.report_item_id=i.id where r.report_status=2 and r.add_date between '2020-01-01' and '2020-12-30' group by i.project_id,d.antibiotic_dict_id,d.drugs_result ) a group by a.project_name,a.antibiotic_dict_name ) aa right join ( select i.project_name,d.antibiotic_dict_name,if(d.drugs_result<> '' , d.drugs_result, '未填写' ) as drugs_result, count (d.id) as 数量 from `report` r right join report_item i on r.id=i.report_id right join report_item_drugs d on d.report_item_id=i.id where r.report_status=2 and r.add_date between '2020-01-01' and '2020-12-30' group by i.project_id,d.antibiotic_dict_id,d.drugs_result )bb on aa.project_name=bb.project_name and aa.antibiotic_dict_name=bb.antibiotic_dict_name where aa.`检出总数`<> '' |
4、一般来说,到上一步不同药敏数量和总数都有了,可以直接求比例了
但是,我们需要的是将药敏显示到行上,直接求比不符合需求,所以我们需要将列转换为行
我们借助于case when实现行列转换,并将药敏结果根据字典转为方便阅读的汉字
|
select c.project_name 项目名称,c.antibiotic_dict_name 抗生素名称,c.`检出总数`, sum ( case c.`drugs_result` when 'd' then c.`数量` else 0 end ) as '剂量依赖性敏感' , concat( sum ( case c.`drugs_result` when 'd' then format(c.`数量`/c.`检出总数`*100,2) else 0 end ), '%' ) as '剂量依赖性敏感比率' , sum ( case c.`drugs_result` when 'r' then c.`数量` else 0 end ) as '耐药' , concat( sum ( case c.`drugs_result` when 'r' then format(c.`数量`/c.`检出总数`*100,2) else 0 end ), '%' ) as '耐药比率' , sum ( case c.`drugs_result` when 's' then c.`数量` else 0 end ) as '敏感' , concat( sum ( case c.`drugs_result` when 's' then format(c.`数量`/c.`检出总数`*100,2) else 0 end ), '%' ) as '敏感比率' , sum ( case c.`drugs_result` when 'i' then c.`数量` else 0 end ) as '中介' , concat( sum ( case c.`drugs_result` when 'i' then format(c.`数量`/c.`检出总数`*100,2) else 0 end ), '%' ) as '中介比率' , sum ( case c.`drugs_result` when 'n1' then c.`数量` else 0 end ) as '非敏感' , concat( sum ( case c.`drugs_result` when 'n1' then format(c.`数量`/c.`检出总数`*100,2) else 0 end ), '%' ) as '非敏感比率' , sum ( case c.`drugs_result` when 'n' then c.`数量` else 0 end ) as '无' , concat( sum ( case c.`drugs_result` when 'n' then format(c.`数量`/c.`检出总数`*100,2) else 0 end ), '%' ) as '无比率' , sum ( case c.`drugs_result` when '未填写' then c.`数量` else 0 end ) as '未填写' , concat( sum ( case c.`drugs_result` when '未填写' then format(c.`数量`/c.`检出总数`*100,2) else 0 end ), '%' ) as '未填写比率' from ( select bb.project_name,bb.antibiotic_dict_name,bb.drugs_result,bb.`数量`,aa.`检出总数` from ( select a.project_name,a.antibiotic_dict_name, sum (nums) as 检出总数 from ( select i.project_name,d.antibiotic_dict_name,d.drugs_result, count (d.id) as nums from `report` r right join report_item i on r.id=i.report_id right join report_item_drugs d on d.report_item_id=i.id where r.report_status=2 and r.add_date between '2020-01-01' and '2020-12-30' group by i.project_id,d.antibiotic_dict_id,d.drugs_result ) a group by a.project_name,a.antibiotic_dict_name ) aa right join ( select i.project_name,d.antibiotic_dict_name,if(d.drugs_result<> '' , d.drugs_result, '未填写' ) as drugs_result, count (d.id) as 数量 from `report` r right join report_item i on r.id=i.report_id right join report_item_drugs d on d.report_item_id=i.id where r.report_status=2 and r.add_date between '2020-01-01' and '2020-12-30' group by i.project_id,d.antibiotic_dict_id,d.drugs_result )bb on aa.project_name=bb.project_name and aa.antibiotic_dict_name=bb.antibiotic_dict_name where aa.`检出总数`<> '' ) c group by c.project_name,c.antibiotic_dict_name; |
5、查看结果,成功转换
到此这篇关于mysql 行列转换的示例代码的文章就介绍到这了,更多相关mysql 行列转换内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
原文链接:https://blog.csdn.net/kk_gods/article/details/111933336
您可能感兴趣
- mysql统计下个月过生日的人数(Mysql出生日期转换为年龄并分组统计人数的方法示例)
- mysqlupdate原理(MySQL UPDATE 语句的非标准实现代码)
- 怎么将mysql彻底卸载(如何把Mysql卸载干净亲测有效)
- mysql提高分页效率(MySQL优化教程之超大分页查询)
- mysql字符串的表示方法(详解mysql中的字符集和校验规则)
- ubuntu20.2安装mysql(Ubuntu 14.04下mysql安装配置教程)
- mysql中定义字段时zerofill属性的作用
- mysql基本查询方法(MySQL 重写查询语句的三种策略)
- mysql8.0.15安装详细教程(Mysql8.0.22解压版安装教程小白专用)
- 忘记mysql密码怎么登录(Mysql用户忘记密码及密码过期问题的处理方法)
- docker查找redis配置文件(解决docker重启redis,mysql数据丢失的问题)
- mysqldecimal类型数据转换(mysql decimal数据类型转换的实现)
- mysql的浮点数类型(浅谈MySQL中float、double、decimal三个浮点类型的区别与总结)
- mysql 查询语法常见问题(MySQL 异常有这一篇就够了!)
- mysql读写分离怎么做(MySQL读写分离,写完读不到问题如何解决)
- 在mysql语法中用来修改数据的命令(explain命令为什么可能会修改MySQL数据)
- 巴厘岛旅游攻略(巴厘岛旅游攻略7天多少钱)
- 文莱旅游攻略(文莱旅游攻略介绍)
- 马来西亚旅游攻略(马来西亚旅游攻略自由行攻略)
- 缅甸旅游攻略(缅甸旅游攻略必去景点推荐)
- 《庆余年2》新消息,原班人马,肖战特别出演,这才是最好的安排(庆余年2新消息原班人马)
- 宁夏灵武恐龙化石发现始末(宁夏灵武恐龙化石发现始末)
热门推荐
- auto.js源码分享(最新热门脚本Autojs源码分享)
- 新手nginx反向代理问题(详解Nginx proxy_pass的一个/斜杠引发的血案)
- nginx 可以部署java吗(Java-利用Nginx负载均衡实现Web服务器)
- 阿里云服务器远程连不上(阿里云服务器重置后无法远程登录解决方案)
- iframe解决跨域问题(跨域修改iframe页面内容详解)
- 写出好代码的几个建议
- nginx与tomcat长连接(Windows下使用Nginx+Tomcat做负载均衡的完整步骤)
- python协程详解(为什么你还不懂得怎么使用Python协程)
- dockervolume迁移工具(Docker中数据卷volume管理的两种方式)
- webui控件在前端开发中的作用(HTML5 weui使用笔记)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9