今天在做一个查询报表需要将多行的查询结果转换成一行,数据格式如下

  ID       Type  Parameter Value     Machine_NO   Operator   UpdateTime

1 111111111111 DS   after     155.780000     P2-2222      88888888   2014/6/5 11:52:13 
2 111111111111 DS   airbag   0.850000        P2-2222     88888888   2014/6/5 11:52:40 
3 111111111111 DS   before   163.570000      P1-1111     00000000   2014/6/5 11:30:05 
4 111111111111 DS     delta     22.990000      P2-2222     88888888   2014/6/5 11:52:25 
5 111111111111 IJ    after      163.570000      P1-1111     00000000   2014/6/5 11:29:57 
6 111111111111 IJ    before   133.640000     P1-1111     00000000   2014/6/5 11:21:51 
7 111111111111 IJ    delta     29.9300001     P1-1111     00000000   2014/6/5 11:30:21

 

需要将这7行数据转换成2行数据,将同一ID同一Type不同的parameter的Value值放到同一行中。

如下的结果

如果用拼接的方法来完成这个任务虽然能达到同样的效果,但是SQL非常长不易理解。而且SQL语句的执行效率很低很浪费数据库资源。

在ORACLE 中有一个函数(Pivot)可以很容易的达到这个效果

用法Select * From 表名
PIVOT
(
  SUM('要合并的列1'),MAX('要合并的列2'),....FOR 将值转换成列的列名 IN
(列值1,列值2,列值3,列值4....)
)

从用法中可以看出sum,max是配合PIVOT聚合函数,聚合函数必须要有。

实际用例:

select *
  from (

    select ID,

        Type,

        parameter,

        value,

        machine_no,

        Operator,

        update_time
            from tableName)

pivot(

    max(value) as value,

     max(machine_no) as machine_no,

    max(Operator) as Operator,

    max(update_time) as update_time

   for parameter in(  

            'before' as Before,

            'after' as After,

            'delta' as Delta,

            'airbag' as AirBag )
      
                )
 where ID= '111111111111'

在转换过程中生成的新列名是由上面红色字组合成的,生成的新列数为4*4=16列。例:Before_Value Before_Machine_No,Before_Operator,

下图是执行计划

最新文章

  1. FineReport实现EXCEL数据导入自由报表
  2. 关于开发中 hosts 文件的修改
  3. 网页倒计时,动态显示"××年还剩××天××时××分××秒"
  4. css常用代码
  5. maven-source 1.3 中不支持注释请使用 -source 5 或更高版本以启用注释
  6. 模板:abs用法
  7. Android之线程终止
  8. String.Trim
  9. Android FindMyPhone功能模块的实现
  10. Delphi基础Write写入结构体到文件(使用 file of myrecord就行了,真简单)
  11. oracle配置odbc数据源
  12. 【省带宽、压成本专题】深入解析 H.265 编码模式,带你了解 Apple 全面推进 H.265 的原因
  13. centos 6.5 安装redis
  14. None.js 第四步 事件驱动程序
  15. Java编程的逻辑 (93) - 函数式数据处理 (下)
  16. POJ - 2828 Buy Tickets(线段树单点更新)
  17. Visual Studio 2012 调试程序加载缓慢,提示正在下载符号
  18. nginx日志request_time 和upstream_response_time区别
  19. windows程序设计.窗口.
  20. 计算mysql 数据库 表大小 服务器传输 小写表明转成大写

热门文章

  1. [LeetCode] Unique Paths II 不同的路径之二
  2. Node.js Express 路由文件分类
  3. iOS Version 和 Build 版本号
  4. 简单的angular购物车商品小计
  5. 退出recoveyr模式的iOS设备
  6. Mybatis 学习笔记1
  7. MyBatis 入门
  8. LeetCode Longest Substring with At Most Two Distinct Characters
  9. vsftp 定时任务同步
  10. 查询某个表或者所有表的字段说明 SQLServer
  11. iOS开发HTTPS实现之信任SSL证书和自签名证书
  12. git基础入门之常用命令操作
  13. 为什么 JavaScript 中基本数据类型拥有 toString 之类方法?
  14. react native学习1-安装,执行
  15. 十大最值得注意的MySQL变量
  16. Windows Azure 安全最佳实践 - 第 6 部分:Azure 服务如何扩展应用程序安全性
  17. poj2777--Count Color(线段树,二进制转化)
  18. hadoop 50070 无法访问问题解决汇总
  19. 简单了解AJAX
  20. 使用shiro的密码服务模块