- 浏览: 97719 次
- 性别:
- 来自: 广州
文章分类
最新评论
数据库查询中难免会遇到行列转换的情况,摘列一些较精典的解决方案
--####################################################################
一、采用SQL decode和PL/SQL函数实现
--####################################################################
1、固定列数的行列转换
如
student subject grade
---------------------------
student1 语文 80
student1 数学 70
student1 英语 60
student2 语文 90
student2 数学 80
student2 英语 100
……
转换为
语文 数学 英语
student1 80 70 60
student2 90 80 100
……
语句如下:
一、采用SQL decode和PL/SQL函数实现
--####################################################################
1、固定列数的行列转换
如
student subject grade
---------------------------
student1 语文 80
student1 数学 70
student1 英语 60
student2 语文 90
student2 数学 80
student2 英语 100
……
转换为
语文 数学 英语
student1 80 70 60
student2 90 80 100
……
语句如下:
select student,sum(decode(subject,'语文', grade,null)) "语文", sum(decode(subject,'数学', grade,null)) "数学", sum(decode(subject,'英语', grade,null)) "英语" from table group by student
2、不定列行列转换
如
c1 c2
--------------
1 我
1 是
1 谁
2 知
2 道
3 不
……
转换为
1 我是谁
2 知道
3 不
这一类型的转换必须借助于PL/SQL来完成,这里给一个例子
摘录自:http://www.360doc.com/showWeb/0/0/18772.aspx
如
c1 c2
--------------
1 我
1 是
1 谁
2 知
2 道
3 不
……
转换为
1 我是谁
2 知道
3 不
这一类型的转换必须借助于PL/SQL来完成,这里给一个例子
CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER) RETURN VARCHAR2 IS Col_c2 VARCHAR2(4000); BEGIN FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP Col_c2 := Col_c2||cur.c2; END LOOP; Col_c2 := rtrim(Col_c2,1); RETURN Col_c2; END; / SQL> select distinct c1 ,get_c2(c1) cc2 from table;即可
摘录自:http://www.360doc.com/showWeb/0/0/18772.aspx
--####################################################################
二、使用分析函数进行行列转换
--####################################################################
其实使用分析函数进行处理是很好的方式,翻一下Tom的书,将其中的一个例子收录在这里. 比如查询scott.emp表的用户SAL排序信息,可以使用如下查询:
二、使用分析函数进行行列转换
--####################################################################
其实使用分析函数进行处理是很好的方式,翻一下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.
再结合其他函数进行一下行列转换:
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
这个结果基本上还是差强人意的。
发表评论
-
【转】导出网页中的table到excel 使用Java方式
2011-08-04 12:02 1655response.setContentType(&qu ... -
【转】select元素javascript常用操作
2011-05-03 16:15 660/*-------------------------- ... -
【转】使用Spring的NamedParameterJdbcTemplate完成DAO操作
2011-04-22 15:33 1100NamedParameterJdbcTemplate内 ... -
【转】使用Spring的SimpleJdbcTemplate完成DAO操作
2011-04-22 15:31 976SimpleJdbcTemplate内部包含了一个Na ... -
【转】Servlet实现文件下载的源码
2011-04-18 11:37 578一、如何使用如果此Servlet命名为download ... -
【转】Oracle:Merge Into 语句代替Insert/Update在Oracle中的应用实战
2011-04-13 14:30 2038动机: 想在Oracle中 ... -
【转】直接把EXCEL粘贴到网页上
2011-04-06 08:33 1222<html> <meta http- ... -
【转】word 任意页开始插入页码
2011-03-31 15:45 1066一、如果你想从第二页开始插入页码的话: 1、将鼠标定位 ... -
【转】最简单的java模板引擎——JTPL
2011-03-27 15:31 2488sample1.jtpl < ... -
【转】JS特效代码大全(七)超全的JS树形菜单共享
2011-03-25 08:59 1236JS特效代码大全(七)超全的JS树形菜单共享 标 ... -
【转】JavaScript获取select的值全解
2011-03-24 15:53 818获取显示的汉字 document.getElemen ... -
【转】常用的JavaScript验证正则表达式
2011-03-07 13:22 743下面都是我收集的一些比较常用的正则表达式,因为平常可能在 ... -
【转】flex的问题解决
2011-02-27 03:05 1275出自:http://www.iteye.com/problem ... -
【转】软考、职称、职称资格及三者之间的关系
2010-08-02 09:19 1476目前,人事部 ... -
【转】如何学Flex
2010-07-31 18:54 856如何学Flex 近由于 ... -
【转】javamail发送邮件的简单实例
2010-07-29 11:19 1135今天学习了一下JavaMail,javamail发送 ... -
【转】hibernate的Criteria Query
2010-07-29 10:03 1138当查询数据时,人们往往需要设置查询条件。在SQL或HQ ...
相关推荐
oracle行转列
用存储过程写的动态行转列。简单易用,查询速度高效
oracle行转列_列转行,实例加解析,自己测试没问题。免费分享了~
Oracle行转列
NULL 博文链接:https://vernonchen163.iteye.com/blog/1902976
oracle 行转列的sql语句写法, 附带例子
oracle数据库最详细的行转列资料,是官方文档的详细介绍版,中文的
数据库查询中难免会遇到行列转换的情况,摘列一些较精典的解决方案
NULL 博文链接:https://13966692733-163-com.iteye.com/blog/1192434
关于oracle数据库如何行转列SQL语句。
SQL行转列问题,有实例,根据具体实例讲解,清晰易懂。 希望对你有帮助!
Oracle中使用语句将行数据转换称不同的列表示,或者将不同的列数据写到同一列的不同行上的行列转换问题是一个非常传统的话题。 网络上流传了很多将行数据转换称列数据的方法和应用实例,一般通过decode或者case函数...
oracle实现行转列功能,并使用逗号进行隔开拼接,成为一条数据.pdf
行转列函数,对于学习sql查询的朋友们,可能会遇到这样的要求,此文档中做了详细记载,希望可以帮到你!
许多情况下,由于程序中需要将行转为列展示,如果使用ORACLE那么这个资源适合你。
理解日常工作中常用到的多列分组, 如【统计不同部门、 不同职位的平均工资】和 行转列 包含例子 和 个人理解分析
DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列
sql 行转列 与列转行,oracle ,msssql等,详细数据库操作方法,各种例子,欢迎大家学习。、~