行列转换包括以下六种情况:

*列转行

*行转列

*多列转换成字符串

*多行转换成字符串

*字符串转换成多列

*字符串转换成多行

下面分别进行举例介绍。

首先声明一点,有些例子需要如下10g及以后才有的知识:

a、掌握model子句

b、正则表达式

c、加强的层次查询

讨论的适用范围只包括8i,9i,10g及以后版本。begin:

1、列转行

未列转行之前的效果如下:

列转行的效果如下:

sql代码:

CREATE TABLE t_col_row(ID INT,c1 VARCHAR2(10),c2 VARCHAR2(10),c3 VARCHAR2(10)
);INSERT INTO t_col_row VALUES (1, 'v11', 'v21', 'v31');
INSERT INTO t_col_row VALUES (2, 'v12', 'v22', NULL);
INSERT INTO t_col_row VALUES (3, 'v13', NULL, 'v33');
INSERT INTO t_col_row VALUES (4, NULL, 'v24', 'v34');
INSERT INTO t_col_row VALUES (5, 'v15', NULL, NULL);
INSERT INTO t_col_row VALUES (6, NULL, NULL, 'v35');
INSERT INTO t_col_row VALUES (7, NULL, NULL, NULL);
COMMIT;SELECT * FROM t_col_row;

1).UNION ALL–>适用范围:8i,9i,10g及以后版本
sql代码:

SELECT id, 'c1' cn, c1 cvFROM t_col_row
UNION ALL
SELECT id, 'c2' cn, c2 cvFROM t_col_row
UNION ALL
SELECT id, 'c3' cn, c3 cv FROM t_col_row;

若空行不需要转换,只需加一个where条件,

sql代码:

WHERE COLUMN IS NOT NULL  

2).MODEL–>适用范围:10g及以后

SELECT id, cn, cv FROM t_col_row
MODEL
RETURN UPDATED ROWS
PARTITION BY (ID)
DIMENSION BY (0 AS n)
MEASURES ('xx' AS cn,'yyy' AS cv,c1,c2,c3) --xx、yyy表示字段长度
RULES UPSERT ALL
(cn[1] = 'c1',cn[2] = 'c2',cn[3] = 'c3',cv[1] = c1[0],cv[2] = c2[0],cv[3] = c3[0]
)
ORDER BY ID,cn;

现在小分析一下上面这个查询:

partition by(prd_type_id)指定结果是根据prd_type_id分区的。

dimension by(0 as n) 定义数组的长度,这就意味着必须提供数组索引才能访问数组中的单元。

measures('xx' AS cn)表明数组中的每个单元包含一个数量,同时表明数组名为cn。

3).collection->适用范围:8i,9i,10g及以后版本

要创建一个对象和一个集合:

sql语句:

create TYPE cn_pair as OBJECT(cn VARCHAR(10),cv VARCHAR2(10));
CREATE TYPE cv_varr AS VARAY(8) OF cv_pair;select id,t.cn AS cn,t.cv AS cvFROM t_col_row,TABLE(cv_varr(cv_pair('c1',t_col_row.c1),cv_pair('c2',t_col_row.c2),cv_pair('c3',t_col_row.c3)))  t
ORDER BY 1,2

2、行转列

未行转列之前的效果如下:

行转列效果如下:

CREATE TABLE t_row_col AS
SELECT id, 'c1' cn, c1 cvFROM t_col_row
UNION ALL
SELECT id, 'c2' cn, c2 cvFROM t_col_row
UNION ALL
SELECT id, 'c3' cn, c3 cv FROM t_col_row;SELECT * FROM t_row_col ORDER BY 1,2;

1)AGGREGATE  FUNCTION ->适用范围:8i,9i,10g及以后版本

select id ,max(decode(cn,'c1',cv,null)) as cl,max(decode(cn,'c2',cv,null)) as c2,max(decode(cn,'c3',cv,null))  as c3
from t_row_col
group by id
order by 1

max 聚集函数也可以用sum,min,avg等其他聚集函数替代。

被指定的转置列只能有一列,但固定的列可以有多列,请看下面的例子:

select mgr,depton,ename from scott.emp order by 1,2;select mgr,deptno,max(decode(empno,'7788',ename,null)) "7788",max(decode(empno,'7902',ename,null)) "7902",MAX(decode(empno, '7844', ename, NULL)) "7844",MAX(decode(empno, '7521', ename, NULL)) "7521",MAX(decode(empno, '7900', ename, NULL)) "7900",MAX(decode(empno, '7499', ename, NULL)) "7499",MAX(decode(empno, '7654', ename, NULL)) "7654"
from scott.emp
where mgr in (7566,7698)and deptno in (20,30)
group by mgr,deptno
order by 1,2

这里转置列为empno,固定列为mgr,deptno。

还有一种行转列的方式,就是相同组中的行值变为单个列值,但转置的行值不变为列名:

参考来源:http://www.cnblogs.com/linjiqin/p/3148808.html

转载于:https://www.cnblogs.com/xianfengzhike/p/9126994.html

Oracle 行列转换总结相关推荐

  1. Oracle 行列转换

    Oracle 行列转换 1.固定列数的行列转换 如 student subject grade --------- ---------- -------- student1 语文 80 student ...

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

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

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

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

  4. Oracle行列转换的思考与总结

    最近几天一直在弄Oracle-SQL的问题,涉及到了一些平时没有用到的东西,也因此而在这里郁闷了好久.现在问题得到了解决虽说不算完美.但是还是和大家一起分享一下. 行列转换之一:sum(case wh ...

  5. oracle行列转换总结

    最近论坛很多人提的问题都与行列转换有关系,所以我对行列转换的相关知识做了一个总结, 希望对大家有所帮助,同时有何错疏,恳请大家指出, 我也是在写作过程中学习,算是一起和大家学习吧. 行列转换包括以下六 ...

  6. oracle行列转换关联union的方式_几行代码轻松玩转 Excel 行列转换

    几行代码轻松玩转 Excel 行列转换 下面这种交叉式的 Excel 表是很常见的格式,用来填写和查看都比较方便: 但是,如果想做进一步的统计分析,这种格式就不方便了,需要行列转换,变成如下格式的明细 ...

  7. oracle 的行列转换函数,Oracle行列转换函数

    VM_CONCAT vm_concat可以用来进行行转列,默认以逗号分隔,可通过vm_concat(name,',','|')修改为|1 2 3 4 5 6 7 8 9 10 11 12 13SQL& ...

  8. oracle行列转换

    多行转一行: 表结构: 1  A 1  B 1  C 2  A 2  B 3  C 3  F 4  D 转换后变成: 1  A,B,C 2  A,B 3  C,F 4  D 这个不排序: SELECT ...

  9. [Oracle]行列转换(行合并与拆分)

    使用wmsys.wm_concat 实现行合并 在 Oracle  中, 将某一个栏位的多行数据转换成使用逗号风格的一行显示,可以使用函数  wmsys.wm_concat 达成. 这个在上一篇 or ...

最新文章

  1. 【Android 应用开发】Android 返回堆栈 与 任务
  2. JavaScript高级程序设计(二):在HTML中使用JavaScript
  3. mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法
  4. 朱江洪功成身退 朱董配解体谁主格力(图)
  5. PHP源码安装及配置——以fastCGI的方式与httpd整合
  6. 中职计算机操作系统,中职计算机应用基础操作系统试题
  7. RequireJS简单教程
  8. lucene3.0_IndexSearcher排序
  9. oracle索引大小暴增_Oracle创建索引前估算索引大小(dbms_space.create_index_cost)
  10. Java旅游管理系统
  11. linux udp数据包发送间隔,如何每1 ms发送一次UDP数据包?
  12. retainall的问题
  13. 蓝绿红黑灰|常用的发布方式
  14. Mac删除文件提示“不能删除xx项目,正在使用中”
  15. NRF52840 和电脑 进行蓝牙通信
  16. 【微信小程序】初识微信小程序组件
  17. 医学图像分割新网络:Boundary-aware Context Neural Network for Medical Image Segmentation
  18. 2016即将结束,你的目标实现了吗?
  19. http的长连接 和短连接
  20. NYOJ 1239 引水工程 【MST 变形】

热门文章

  1. Tomcat下conf下server.xml的文件配置信息
  2. iOS应用程序生命周期(前后台切换,应用的各种状态)详解
  3. [bzoj 4199][NOI 2015]品酒大会
  4. 对python源码进行编译,加密python脚本
  5. vue 不能监测数组长度变化length的原因
  6. SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)...
  7. Redux 学习笔记
  8. 视觉直观感受 7 种常用的排序算法
  9. 浅析主键自增长的优缺点
  10. c盘哪些文件可以删除