1) 列转行
WITH TB AS ( SELECT '1' AS SID, '英语' AS E, '70' AS E_SCORE, '数学' S, '89' AS S_SCORE, '语文' AS T, '69' AS T_SCORE FROM DUAL ) SELECT SID,E AS 科目,E_SCORE AS 分数 FROM ( SELECT SID,E,E_SCORE FROM TB UNION ALL SELECT SID,S,S_SCORE FROM TB UNION ALL SELECT SID,T,T_SCORE FROM TB );
2) 行转列 (数值类型)
WITH TB AS ( SELECT '1' AS SID, '英语' AS E,'70' AS E_SCORE FROM DUAL UNION ALL SELECT '1' AS SID, '数学' S,'89' AS S_SCORE FROM DUAL UNION ALL SELECT '1' AS SID, '语文' AS T,'69' AS T_SCORE FROM DUAL UNION ALL SELECT '2' AS SID, '英语' AS E,'72' AS E_SCORE FROM DUAL UNION ALL SELECT '2' AS SID, '数学' S,'58' AS S_SCORE FROM DUAL UNION ALL SELECT '2' AS SID, '语文' AS T,'60' AS T_SCORE FROM DUAL UNION ALL SELECT '3' AS SID, '英语' AS E,'85' AS E_SCORE FROM DUAL UNION ALL SELECT '3' AS SID, '数学' S,'90' AS S_SCORE FROM DUAL ) SELECT SID, SUM(DECODE(E,'英语',E_SCORE)) AS 英语, SUM(DECODE(E,'语文',E_SCORE)) AS 语文, SUM(DECODE(E,'数学',E_SCORE)) AS 数学 FROM TB GROUP BY SID;
3) 方法一:行转列 (字符串类型,适用于数值类型)
WITH TB AS ( SELECT 1 AS ID,'你' AS NAME FROM DUAL UNION ALL SELECT 1 ,'好' FROM DUAL UNION ALL SELECT 1 ,'吗' FROM DUAL UNION ALL SELECT 2 ,'我' FROM DUAL UNION ALL SELECT 2 ,'不' FROM DUAL UNION ALL SELECT 2 ,'好' FROM DUAL ), TB2 AS ( SELECT ID, NAME, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID) AS RN FROM TB ), TB3 AS ( SELECT ID, MAX(SYS_CONNECT_BY_PATH(NAME,' ')) AS NAME FROM TB2 START WITH RN = 1 CONNECT BY PRIOR RN = RN - 1 AND PRIOR ID = ID GROUP BY ID ) SELECT ID,REPLACE(NAME,' ','') AS NAME FROM TB3;
4) 方法二:行转列 (字符串类型,适用于数值类型)
WITH TB AS ( SELECT 1 AS ID,'你' AS NAME FROM DUAL UNION ALL SELECT 1 ,'好' FROM DUAL UNION ALL SELECT 1 ,'吗' FROM DUAL UNION ALL SELECT 2 ,'我' FROM DUAL UNION ALL SELECT 2 ,'不' FROM DUAL UNION ALL SELECT 2 ,'好' FROM DUAL ), TB2 AS ( SELECT ID, NAME, RN, LAG(RN) OVER(PARTITION BY ID ORDER BY RN) AS LG FROM ( SELECT ID,NAME,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID) AS RN FROM TB ) ), TB3 AS ( SELECT ID, MAX(SYS_CONNECT_BY_PATH(NAME,' ')) AS NAME FROM TB2 START WITH RN = 1 CONNECT BY PRIOR RN = RN - 1 AND PRIOR ID = ID GROUP BY ID ) SELECT ID,REPLACE(NAME,' ','') AS NAME FROM TB3;
相关推荐
Oracle行列转换,一个挺经典的例子,值得学习和思考……
本例子主要是实现了oracle行列的转换,这个挺有用的
oracle行. 列转换的总结。。。。。。。。。。。。
oracle行列转换,通过实例来实现表的行列转换
ORACLE 行列转换,ORACLE,行列转换
oracle行列转换示例,查询转换,有创表过程,数据,清晰明了
Oracle 行列转换 总结 很实用的一个文档。
oracle行列转换[文].pdf
详细的例子描述各类行列转换,非常好的一份pdf文档, 强烈推荐
常见的数据库面试关于行转列列转行的操作,方便你的面试,经常考到的
行列转换包括以下六种情况: 1. 列转行 2. 行转列 3. 多列转换成字符串 4. 多行转换成字符串 5. 字符串转换成多列 6. 字符串转换成多行
行列转换,sys_connect_by_path,row_number等函数的用法
很通俗易懂的行列转换的例子,适用于oracle数据库,我一看都明白了
本人在工作中遇到了涉及到数据库行列之间相互转换的问题,在网上搜索了很久也没有一个比较完整的解释,通过本人自己的摸索测试,整理出来了Oracle中SQL语句行列之间相互转换的资料,大家可以下载学习。
oracle的行列转换例子,行转列,列转行。主要针对oracle10g
分别讲述了SQLServer和Oracle行列转换的两种方式,可以通过SQL实现,也可通过关键字搞定; 还可以看到Oracle与SQLServer关键字用法的差异。