知识大全 Oracle11gSQL新功能pivot/unpivot

Posted

篇首语:人类的一切努力的目的在于获得幸福。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Oracle11gSQL新功能pivot/unpivot相关的知识,希望对你有一定的参考价值。

Oracle11gSQL新功能pivot/unpivot  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   g以前的行列转换

  领袖又说了 温故而知新 那就让我们先看看 g以前是怎么实现地 行列转换一直当作甄别老手和新手的试金石 面试的时候面试官不问这个都不好意思张嘴 Itpub的Oracle开发版更是每隔十天半个月就有人问这个 你说重要不重要

  假设有表emp_phone如下

NAMETYPEPHONE 张三 张三 张三 李四 李四 马五u 马五 王二(没麻子)    

  表里放著张三李四王二麻子等等主人翁的电话号码 (TYPE / / 分别对应家/办公室/手机) 如果要把每个人的所有电话放在一行上 就是行转列了 结果如下

NAMEHOMEOFFICEMOBILE 张三 李四   马五   王二(没麻子)  

  写这个SQL的技巧就是按姓名分组 然后使每一组每一类的电话号码最多只有一个 里边用到的分组函数都是聋子的耳朵-摆设 用MAX可以 MIN也行

  这个查询写出来就是          SELECT        name         MAX(decode(type phone)) Home         MAX(decode(type phone)) Office         MAX(decode(type phone)) Mobile        FROM        emp_phone        GROUP BY        Name        /

  那位看官说了 能不能再变回去? 能 不能戏法不就漏了不是?

  这儿要用到另一的技巧就是笛卡尔乘积 将一行复制成三行 每一行取一个类型的电话

  偷个懒儿把上边的结果表叫emp_phone_x 把列还原成行的SQL          SELECT        NAME         DECODE (lvl home office mobile) phone        FROM        emp_phone_x         (SELECT LEVEL lvl        FROM DUAL        CONNECT BY LEVEL <= )        WHERE        DECODE (lvl home office mobile) IS NOT NULL /

   g 自带的行列转换

  旁边那个带眼镜 说的就是你 眼珠子直勾勾的怎么了?上面的没看懂? 要是以前 我老先生就得语重心长地教育你 那么重要的东西没看懂 将来想不想换工作了?但现在这话就说不出口了 因为 g的SQL自己就带这个了

   g在SELECT语句中新加了关键词PIVOT和UNPIVOT 用这两个关键词 重写上面的两个查询 就变成这个样子的了

  行变列          SELECT * FROM emp_phone        PIVOT (        MAX(phone) for type IN ( as home as office as mobile)        )        /

  PIVOT以后的字句都是新加的 但万变不离其宗 还是要用到分组函数 IN后边是按type的不同值映射成不同的列 简单吧?

  列变行 这是UNPIVOT的工作 写法如下          SELECT * FROM emp_phone_x        UNPIVOT (        phone FOR type in (HOME AS OFFICE AS MOBILE AS )        )        /

  这里是把不同的列转换成不同的type的数值

  再用SCOTT用户里的EMP表做个例子 列出各部门之间工资总和          SELECT * FROM        (        (SELECT sal deptno FROM emp)        PIVOT (        SUM(sal) FOR deptno IN ( as dept_ as dept_ as dept_ )        )        )        /        DEPT_ DEPT_ DEPT_                

  再往深里想 前边的所有例子都有一个局限 电话的type和emp的deptno都是有限的 可穷举的 如果这些列都是可随时可添加的 又该怎么办呢? g以前肯定是要动用动态SQL的法宝 那 g又是怎么处理的呢?刚看SQL参考手册的时候 看到里边豁然写着IN后边可以接子查询或ANY 当时是佩服的眼泪哗哗的 迫不及待赶紧试一试          SELECT * FROM        (        (SELECT sal deptno FROM emp)        PIVOT (        SUM(sal) FOR deptno IN (SELECT deptno FROM dept)        )        )        /        ERROR at line :        ORA : missing expression        SELECT * FROM        (        (SELECT sal deptno FROM emp)        PIVOT (        SUM(sal) FOR deptno IN (ANY)        )        )        /        ERROR at line :        ORA : missing expression

  这一下又变成拔凉拔凉的 这么大个ORACLE也不能无耻到这个地步吧?正准备再确认一下手册 抓他个人赃俱获 突然有发现里边豁然写着    A subquery is used only in conjunction with the XML keyword…

  The ANY keyword is used only in conjunction with the XML keyword…

  学习不认真 该打 原来是给生成XML串用的 正确用法如下          SELECT * FROM        (        (SELECT sal deptno FROM emp)        PIVOT XML (        SUM(sal) FOR deptno IN (ANY)        )        )        <PivotSet>        <item>        <column name = DEPTNO > </column>        <column name = SUM(SAL) > </column>        </item>        <item>        <column name = DEPTNO > </column>        <column name = SUM(SAL) > </column>        </item>        <item>        <column name = DEPTNO > </column>        <column name = SUM(SAL) > </column>        </item>        </PivotSet>

cha138/Article/program/Oracle/201311/16652

相关参考

知识大全 深入浅出Oracle11g分区功能

深入浅出Oracle11g分区功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据库分区是每

知识大全 Oracle11G之初体验数据中心自动化等功能

Oracle11G之初体验数据中心自动化等功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  O

知识大全 ORACLE11iGL设置逻辑

ORACLE11iGL设置逻辑  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ORACLE财务系

知识大全 Oracle11gSQLPerformanceAnalyzer感受

Oracle11gSQLPerformanceAnalyzer感受  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一

知识大全 Oracle内存数据库11g和高速缓存11g上市

Oracle内存数据库11g和高速缓存11g上市  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!北京

知识大全 管理oracle11gRAC

管理oracle11gRAC  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  检查集群状态  [g

知识大全 Oracle11g默认目录结构

Oracle11g默认目录结构  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracleg主流

知识大全 Oracle 11g安装图文攻略

Oracle11g安装图文攻略  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  呵呵花了一个多小时

知识大全 oracle11G空表默认不导出解决

oracle11G空表默认不导出解决  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ORACLE

知识大全 Oracle11g数据库移植

Oracle11g数据库移植  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据库版本频繁更新不