【IT168技术文档】摘要:(简要介绍Oracle11g SQL的新功能 pivot/unpivot 的使用方法以及如何使用它们做到行列转换.

蓄势以久的Oracle 11g 终于七月敲锣打鼓隆重推出,接下来就是网上漫天盖地的新功能介绍。11g面向开发的新功能本来就不多,掰着手指头也就是pivot和查询结果缓存的新Hint。本以为不久就会有人详述,谁知盼到两眼欲穿,大家还是翻来覆去的讨论DBA的自动分区之类。Oracle自己的门脸上到是每每用客气的冷漠写着“马上就来” (coming soon),可这马上都转眼都快马上了一个月了,还迟迟不见盖头掀起来。

()

伟人说过“自己动手,丰衣足食”,等不来,咱就自己来。没吃过猪肉,还没见过猪跑?说干就干,下载安装再加一本“SQL参考手册”,齐了。这新花活到底怎么使,且听我从头道来。。。

1. 11g以前的行列转换

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

假设有表emp_phone如下:

NAMETYPEPHONE

张三11234-5678

张三24567-7890

张三36000-1001

李四12123-1237

李四36001-5600

马五u13248-1378

马五23423-3948

王二(没麻子)22890-1245

。。。

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

NAMEHOMEOFFICEMOBILE

张三1234-56784567-78906000-1001

李四2123-12376001-5600

马五3248-13783423-3948

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

这个查询写出来就是:

SELECTname,MAX(decode(type,1, phone)) Home,MAX(decode(type,2, phone)) Office,MAX(decode(type,3, phone)) MobileFROMemp_phoneGROUPBYName

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

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

偷个懒儿把上边的结果表叫emp_phone_x,把列还原成行的SQL:

SELECTNAME,

DECODE (lvl,1, home,2, office,3, mobile) phoneFROMemp_phone_x,

(SELECTLEVELlvlFROMDUAL

CONNECTBYLEVEL<=3)WHEREDECODE (lvl,1, home,2, office,3, mobile)ISNOTNULL/

转来转去,一来一往,阴阳辟易,详推用意终何在,延年益寿不老春。往玄里说,就是老祖宗老挂在嘴边上的“道”。那位又说了:“这都哪儿跟哪儿啊?怎么扯到太极拳上去了”。

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

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

行变列:

SELECT * FROM emp_phone

PIVOT (

MAX(phone) for type IN (1 as home, 2 as office, 2 as mobile)

)

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

列变行,这是UNPIVOT的工作,写法如下:

SELECT*FROMemp_phone_x

UNPIVOT (

phoneFORtypein(HOMEAS1, OFFICEAS2, MOBILEAS3)

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

再用SCOTT用户里的EMP表做个例子,列出各部门之间工资总和:SELECT*FROM(

(SELECTsal, deptnoFROMemp)

PIVOT (SUM(sal)FORdeptnoIN(10asdept_10,20asdept_20,30asdept_30)

)

)/DEPT_10 DEPT_20 DEPT_30---------- ---------- ----------8750108759400

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

SELECT*FROM(

(SELECTsal, deptnoFROMemp)

PIVOT (SUM(sal)FORdeptnoIN(SELECTdeptnoFROMdept)

)

)/ERROR at line5:

ORA-00936: missing expressionSELECT*FROM(

(SELECTsal, deptnoFROMemp)

PIVOT (SUM(sal)FORdeptnoIN(ANY)

)

)/ERROR at line5:

ORA-00936: missing expression

这一下又变成拔凉拔凉的,这么大个ORACLE也不能无耻到这个地步吧?正准备再确认一下手册,抓他个人赃俱获,突然有发现里边豁然写着:

A subqueryisusedonlyinconjunctionwiththe XML keyword…

TheANYkeywordisusedonlyinconjunctionwiththe XML keyword…

学习不认真,该打。原来是给生成XML串用的,正确用法如下:SELECT*FROM(

(SELECTsal, deptnoFROMemp)

PIVOT XML (SUM(sal)FORdeptnoIN(ANY)

)

)10column>

8750column>item>

20column>10875column>item>

30column>9400column>item>PivotSet>

这个东西的结果具体怎么用就留给大家做作业了。反正XML咱也不熟,借这个机会就下了。。。[@more@]

oracle 00936 pivot,oracle 11g 使用 pivot/unpivot 行列转换相关推荐

  1. SQL Server 2005之PIVOT/UNPIVOT行列转换

    SQL Server 2005之PIVOT/UNPIVOT行列转换 作者: NinGoo(http://ningoo.itpub.net) 发表于: 2007.04.18 11:49 分类: SQL ...

  2. SQL Server 2005之PIVOT/UNPIVOT行列转换(转)

    SQL Server2005引入了很多迎合开发者口味的新特性,虽然改动不大,却大大了减少了开发者的工作量,这种替用户考虑的开发思路,值得称赞. 在SQL Server2000中,要实现行列转换,需要综 ...

  3. oracle非常量不能用于privot_Oracle 行列转换函数pivot、unpivot的使用(二)

    一.行转列pivot 关键函数pivot,其用法如下 pivot(聚合函数 for 列名 in(类型)) select * from table_name pivot(max(column_name) ...

  4. oracle 总转横函数,详解Oracle行列转换函数-pivot函数和unpivot函数-多智时代

    今天主要介绍一下Oracle行转列及列转行常见函数,下面一起来看看吧! 行列转换 pivot函数:行转列函数 语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值)): ...

  5. Oracle 行列转换函数pivot使用

    问题描述: 描述:在项目中,需要将表中日期数据行,用视图转列显示月报表 解决方案: 注意:多聚合必须重命名. create table pivottest( 主键 varchar2(50) defau ...

  6. mysql unpivot_SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子...

    使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...

  7. Oracle Database 9i 10g 11g编程艺术 深入数据库体系结构 第2版pdf

    下载地址:网盘下载 <Oracle Database 9i/10g/11g编程艺术:深入数据库体系结构>是公认的Oracle数据库权威指南,凝聚了世界顶尖的Oracle专家Thomas K ...

  8. SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行

    ylbtech-SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行 可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表.PIVOT 通过将表达式某一列 ...

  9. Oracle Study之--Oracle 11g RAC设置归档路径错误案例

    Oracle Study之--Oracle 11g RAC置归档路径错误案例 系统环境: 操作系统: RedHat EL55 集群:     Oracle 11g GI Oracle:   Oracl ...

  10. oracle u01清理,Oracleの/u01/11g/diag/rdbms/orcl/orcl/incident 的清理

    https://docs.oracle.com/cd/E11882_01/server.112/e25494/diag.htm#ADMIN11007 每当一个错误发生的时候,oracle会创建一个in ...

最新文章

  1. iOS网络缓存扫盲篇
  2. Python的__getattribute__ vs __getattr__的妙用
  3. oracle的age datetime,python cx_Oracle插入TIMESTAMP字段后显示格式问题?
  4. Phone List POJ - 3630(字典树模板题)
  5. 古老的spc也可以用机器学习(三)-支持向量机算法
  6. java RSA 加签验签【转】
  7. Apollo进阶课程㉒丨Apollo规划技术详解——Motion Planning with Autonomous Driving
  8. java实现可有括号的android计算器
  9. laravel 下载报错:Unable to guess the mime type as no guessers are available
  10. 让人少奋斗十年的工作经验
  11. 计算机出现全部英文如何解决,电脑打开后出现很多英文怎么处理
  12. python - bs4提取XML/HTML中某个标签下的属性
  13. logging日志模块 , 序列化json pickle , 随机数random
  14. 哈理工OJ-2277-喝喝
  15. 为什么相关不等于因果
  16. ionic4 click防抖指令
  17. Java 错别字检查接口 API
  18. flowchart流程图
  19. 史上最恐怖的10篇超短篇鬼故事(转…
  20. 抓铁有力榜:踏石有印,抓铁留痕

热门文章

  1. 双11购书大优惠!独家优惠券,折后再减,赶紧来抢啊!
  2. 全网搜索一个人的痕迹,爬取百度搜索结果
  3. Java 响应对象详解
  4. WINVNC Server详解
  5. 橄榄山软件长期开放 《软件研发》职位,请随时申请
  6. php自动生成phpunit,PHP单元测试框架PHPUnit的使用
  7. css 多余省略号_css设置文字多余部分显示省略号
  8. 大四学年软件公司实习感悟
  9. pandoc 转换html,pandoc将markdown转换输出HTML slide
  10. 巨象指纹浏览器的反追踪技术原理