知识大全 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分区功能 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 数据库分区是每
Oracle11G之初体验数据中心自动化等功能 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! O
ORACLE11iGL设置逻辑 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ORACLE财务系
知识大全 Oracle11gSQLPerformanceAnalyzer感受
Oracle11gSQLPerformanceAnalyzer感受 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一
Oracle内存数据库11g和高速缓存11g上市 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!北京
管理oracle11gRAC 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 检查集群状态 [g
Oracle11g默认目录结构 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Oracleg主流
Oracle11g安装图文攻略 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 呵呵花了一个多小时
oracle11G空表默认不导出解决 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ORACLE
Oracle11g数据库移植 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 数据库版本频繁更新不