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

  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,

下图是执行计划

Oracle Pivot学习心得的更多相关文章

  1. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  2. 我的MYSQL学习心得(十四) 备份和恢复

    我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  3. Java学习心得之 Linux下搭建Java环境

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 Linux下搭建Java环境 1.前言2.JDK安装3.配置环境变量4. ...

  4. 个人git链接和git学习心得总结

    个人git链接和git学习心得总结 个人git链接: https://github.com/hanzhaoyan Git 是 Linux 的创始人 Linus Torvalds 开发的开源和免费的版本 ...

  5. python pandas库——pivot使用心得

    python pandas库——pivot使用心得 2017年12月14日 17:07:06 阅读数:364 最近在做基于python的数据分析工作,引用第三方数据分析库——pandas(versio ...

  6. MYSQL学习心得(转)

    适合有SQL SERVER或ORACLE基础的人看,有对比,学习更有效果 转自:http://www.cnblogs.com/lyhabc/ 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习 ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  9. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

随机推荐

  1. Pair of Numbers

    Codeforces Round #209 (Div. 2) D:http://codeforces.com/contest/359/problem/D 题意:给以一个n个数的序列,然后问你最大的区间 ...

  2. Truck History(poj 1789)

    Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for v ...

  3. js和jsp

    1.js中的字符串赋值可以用' '或者" ". alert('1111'); alert("1111"); document.getElementById('d ...

  4. 两个div之间有空隙

    加句*{ margin:0; padding:0;} 最近在做网页时发现,在IE7下(FF没试过),div与div之间有时会出20个像素左右的空隙,除非把margin设成负值,否则空隙无法去除.我在 ...

  5. 【Linux】鸟哥的Linux私房菜基础学习篇整理(六)

    1. 正则表达式特殊符号.[:alnum:]:代表英文大小写字符及数字:[:alpha:]:代表英文大小写字符:[:blank:]:代表空格键与[Tab]键:[:cntrl:]:代表键盘上的控制键,即 ...

  6. Apache HTTP Server mod_session_dbd模块mod_session_dbd.c 安全漏洞

    漏洞名称: Apache HTTP Server mod_session_dbd模块mod_session_dbd.c 安全漏洞 CNNVD编号: CNNVD-201307-488 发布时间: 201 ...

  7. AJAX 中Sys.WebForms.PageRequestManager的事件激发顺序 《转》

    AJAX 中Sys.WebForms.PageRequestManager的事件激发顺序 测试代码: 测试代码如下: <%@ Page Language="C#" AutoE ...

  8. 使用Vagrant machine

    使用Vagrant 查看Vagrant状态 vagrant status SSH vagrant ssh 共享文件 在vagrantfile中添加共享文件配置 Vagrant.configure(2) ...

  9. oracle权限问题

    Assign the "Create global objects" user right to the non-Administrator account. 1. Click S ...

  10. Hibernate四 批量处理

    Hibernate批量处理一 批量插入将很多条记录插入数据库时,Hibernate通常会采用以下做法:public void test() { for(int i=0;i<1000;i++){ ...