zoukankan      html  css  js  c++  java
  • SQL行转列:decode函数

      前言

      开发中我们经常会用到行转列,这里记录一下我在项目中实现行转列的思路。需求:报表模块,统计某机房机架的不同状态(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 = '2' --所属机房
     group by ra.service_status

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

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

     

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

  • 相关阅读:
    BLAS, LAPACK, OpenBLAS, MKL, CBLAS等概念
    Flex +WebService
    JS获取Url参数的通用方法
    错误 1 无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口
    asp.net网站中添加百度地图功能
    Asp.net最基本的文件上传功能代码
    牛 JQuery视频笔记
    .Net知识点总结(一)
    javascript删除数组中的某个元素-----拓展Array 原型方法
    JavaScript中this
  • 原文地址:https://www.cnblogs.com/huanzi-qch/p/9962120.html
Copyright © 2011-2022 走看看