前言

  开发中我们经常会用到行转列,这里记录一下我在项目中实现行转列的思路。需求:报表模块,统计某机房机架的不同状态(1 空闲  2 预占  3 占用)的数量(真实需求更为复杂,这里只是讨论技术,简化一下)

  decode函数

  以下介绍摘自百度百科:

  DECODE函数是ORACLE PL/SQL的功能强大的函数之一,以其简洁的运算方式,可控的数据模型和灵活的格式转换而闻名。目前还只有ORACLE公司的SQL提供了此函数,其它数据库厂商的SQL实现还没有此功能。

  在DECODE的语法中,实际上就是这样的逻辑处理过程。它的语法如下:
  DECODE(value, if1, then1, if2,then2, if3,then3, . . . ,else )
  Value 代表某个表的任何类型的任意列或一个通过计算所得的任何结果。当每个value值被测试,如果value的值为if1,Decode 函数的结果是then1;如果value等于if2,Decode函数结果是then2;等等。事实上,可以给出多个if/then 配对。如果value结果不等于给出的任何配对时,Decode 结果就返回else 。
 

  编写SQL

  res_rack机架表,先按状态分组,查询出状态值、已经对应的数量,此时是行数据

select ra.service_status status, count(ra.id) counts --先查询出行数据,状态值对应的数量
from res_rack ra --机架表
where ra.roomid = '' --所属机房
group by ra.service_status

  再利用decode跟sum函数进行值的判断跟统计,完成行转列

select sum(decode(t.status, '', t.counts, 0)) idle, -- 1 为空闲
sum(decode(t.status, '', t.counts, 0)) reserved, -- 2 为预占
sum(decode(t.status, '', t.counts, 0)) occupied -- 1 为占用
from (select ra.service_status status, count(ra.id) counts --先查询出行数据,状态值对应的数量
from res_rack ra --机架表
where ra.roomid = '' --所属机房
group by ra.service_status) t --按照状态值分组

  20.19-07-29补充:MySql是IF函数,用法跟Oracle的DECODE函数一样

最新文章

  1. SQL 隐藏手机号中间四位
  2. 每天一个 Linux 命令(6):rmdir 命令
  3. 实现多项式的JAVA类
  4. Scala 深入浅出实战经典 第58讲:Scala中Abstract Types实战详解
  5. Spring监听器配置
  6. AGG 之贝塞尔插值
  7. jar包版本冲突,并且要保留两个版本都能使用
  8. 【CSS初识】
  9. UVA424高精度加法
  10. Android存储系统的架构与设计
  11. 用eclipse怎样将本地的项目打成jar包上传到maven仓库
  12. 【读书笔记】segment routing mpls数据平面-1
  13. 用greenlet实现协程消费者生产者
  14. Python:GUI之tkinter学习笔记3事件绑定
  15. c# DataTable 序列化json
  16. Java第09次实验(IO流)
  17. 递归函数 day17
  18. Android O 可以上网 提示无法访问网络
  19. centos7安装python-3.5
  20. select自定义下拉选择图标

热门文章

  1. eclipse新建的项目,也添加到tomcat上了,地址栏访问的时候就是访问不到。。。怎么办
  2. nginx三种安装方法(转载)
  3. 【腾讯Bugly干货分享】Android 插件技术实战总结
  4. 【安全开发】浅谈JSP安全开发之XSS
  5. 遇到ANR问题的处理步骤
  6. git常用命令总结——你一定会用到的几个命令
  7. 【雷神源码解析】无基础看懂AAC码流解析,看不懂你打我
  8. CentOS7安装详解
  9. Xamarin.Android ImageView 图片圆角显示
  10. Mac 下使用svn