« 学习-SQL查询连续号码段的巧妙解法 | Blog首页 | 生日快乐 有生的日子里天天快乐 »
使用分析函数进行行列转换
作者:eygle | 【转载请注出处】|【云和恩墨 领先的zData数据库一体机 | zCloud PaaS云管平台 | SQM SQL审核平台 | ZDBM 数据库备份一体机】
链接:https://www.eygle.com/archives/2006/09/use_any_function.html
经常有朋友问到行列转换的问题,留言板上也有这样的提问。链接:https://www.eygle.com/archives/2006/09/use_any_function.html
其实使用分析函数进行处理是很好的方式,翻一下Tom的书,将其中的一个例子收录在这里. 比如查询scott.emp表的用户SAL排序信息,可以使用如下查询:
SQL> SELECT deptno, ename, 2 ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY sal DESC) seq 3 FROM emp; DEPTNO ENAME SEQ ---------- ---------- ---------- 10 KING 1 10 CLARK 2 10 MILLER 3 20 SCOTT 1 20 FORD 2 20 JONES 3 20 ADAMS 4 20 SMITH 5 30 BLAKE 1 30 ALLEN 2 30 TURNER 3 30 WARD 4 30 MARTIN 5 30 JAMES 6 14 rows selected.
再结合其他函数进行一下行列转换:
这个结果基本上还是差强人意的。SQL> select deptno, 2 max(decode(seq,1,ename,null)) highest, 3 max(decode(seq,2,ename,null)) second, 4 max(decode(seq,3,ename,null)) third 5 from ( 6 select deptno,ename, 7 row_number() over 8 (partition by deptno order by sal desc) seq 9 from emp) 10 where seq <=3 group by deptno 11 / DEPTNO HIGHEST SECOND THIRD ---------- ---------- ---------- ---------- 10 KING CLARK MILLER 20 SCOTT FORD JONES 30 BLAKE ALLEN TURNER
-The End-
历史上的今天...
>> 2010-09-26文章:
>> 2009-09-26文章:
>> 2008-09-26文章:
>> 2007-09-26文章:
By eygle on 2006-09-26 16:50 | Comments (4) | SQL.PLSQL | 917 |
如果多了一个部门还要改程序
部门增加是不需要修改程序的。
Oracle有相关的函数进行矩阵数据的行列转换吗?比如
lsh xh n1 n2
111 1 10 100
111 2 20 200
转换成
lsh xh n
111 1 10
111 1 20
111 2 100
111 2 200
我试过用Union all做连接,但字段太多,生成的脚本过于冗长
不用分析函数也可以实现的,性能还不错!