oracle中行列转换

  • 1.行列转换包括以下六种情况:
  • 2. 列转行
    • 2.1 UNION ALL
    • 2.2 MODEL
    • 2.3 COLLECTION
    • 2.4 UNPIVOT
  • 3. 行转列
    • 3.1 AGGREGATE FUNCTION
    • 3.2 PIVOT
  • 4 字符串的行列转换
    • 4.1 多行转字符串
    • 4.2 字符串转多列
    • 4.3字符串转多行
    • 4.4 wm_concat函数
    • 4.4 LISTAGG
      • 4.4.1普通函数
      • 4.4.2 分组函数
      • 4.4.3 分析函数

整理了部分来自论坛及博客关于行列转换的案例,待以学习与备查

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

  1. 列转行
  2. 行转列
  3. 多列转换成字符串
  4. 多行转换成字符串
  5. 字符串转换成多列
  6. 字符串转换成多行

下面分别进行举例介绍。
首先声明一点,有些例子需要如下 10g 及以后才有的知识:
A. 掌握 model 子句
B. 正则表达式
C. 加强的层次查询
讨论的适用范围只包括 8i,9i,10g 及以后版本。

2. 列转行

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;

2.1 UNION ALL

适用范围:8i,9i,10g 及以后版本

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

若空行不需要转换,只需加一个 where 条件,
WHERE COLUMN IS NOT NULL 即可。

2.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) 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;

2.3 COLLECTION

适用范围:8i,9i,10g 及以后版本
要创建一个对象和一个集合:

CREATE TYPE cv_pair AS OBJECT(cn VARCHAR2(10),cv VARCHAR2(10)); CREATE TYPE cv_varr AS VARRAY(8) OF cv_pair;
SELECT id, t.cn AS cn, t.cv AS cv
FROM 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.4 UNPIVOT

适用范围:11g 及以后版本
假设有表student

 SELECT *
FROM student1
UNPIVOT (score FOR subject IN ("语","数","英")
)

得到结果

同样使用一下方法也可以得到上面结果

SELECTNAME,'语' AS subject ,MAX("语") AS score
FROM student1 GROUP BY NAME
UNION
SELECTNAME,'数' AS subject ,MAX("数") AS score
FROM student1 GROUP BY NAME
UNION
SELECTNAME,'英' AS subject ,MAX("英") AS score
FROM student1 GROUP BY NAME

3. 行转列

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

3.1 AGGREGATE FUNCTION

适用范围:8i,9i,10g 及以后版本

SELECT id,
MAX(decode(cn, 'c1', cv, NULL)) AS c1, 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, deptno, empno, ename FROM emp ORDER BY 1, 2;

3.2 PIVOT

适用范围:11g 及以后版本
有表

SELECT *
FROM student
PIVOT (SUM(score) FOR subject IN (语, 数, 英)
)

得到结果

PIVOT 后跟一个聚合函数来拿到结果,FOR 后面跟的科目是我们要转换的列,这样的话科目中的语文、数学、英语就就被转换为列。IN 后面跟的就是具体的科目值。
也可以用 CASE WHEN 得到同样的结果,但没有 PIVOT 简单直观,具体如下

SELECT name,MAX(CASEWHEN subject='语'THEN scoreELSE 0END) AS "语",MAX(CASEWHEN subject='数'THEN scoreELSE 0END) AS "数",MAX(CASEWHEN subject='英'THEN scoreELSE 0END) AS "英"
FROM student
GROUP BY name

以上提到的Pivot 为 SQL 语言增添了一个非常重要且实用的功能。您可以使用 pivot 函数针对任何关系表创建一个交叉表报表,而不必编写包含大量 decode 函数的令人费解的、不直观的代码。同样,您可以使用 unpivot 操作转换任何交叉表报表,以常规关系表的形式对其进行存储。Pivot 可以生成常规文本或 XML 格式的输出。如果是 XML 格式的输出,您不必指定 pivot 操作需要搜索的值域

4 字符串的行列转换

4.1 多行转字符串

这个比较简单,用||或concat函数可以实现

select concat(id,username) str from app_user
select id||username str from app_user

4.2 字符串转多列

实际上就是拆分字符串的问题,可以使用 substr、instr、regexp_substr函数方式

4.3字符串转多行

使用union all函数等方式

4.4 wm_concat函数

10G提供该函数wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行
例子如下:准备测试数据

create table test(id number,name varchar2(20));
insert into test values(1,'a');
insert into test values(1,'b');
insert into test values(1,'c');
insert into test values(2,'d');
insert into test values(2,'e');

效果1 : 行转列 ,默认逗号隔开

select wm_concat(name) name from test;

效果2: 把结果里的逗号替换成"|"

select replace(wm_concat(name),',','|') from test;

效果3: 按ID分组合并name

select id,wm_concat(name) name from test group by id;

4.4 LISTAGG

Oracle11.2新增了LISTAGG函数,可以用于字符串聚集,实现对列值的拼接

官方文档的解释如下:
For a specified measure, LISTAGG orders data within each group specified in the ORDER BY clause and then concatenates the values of the measure column.
即在每个分组内,LISTAGG根据order by子句对列植进行排序,将排序后的结果拼接起来。
measure_expr:可以是任何基于列的表达式。
delimiter:分隔符,默认为NUL
order_by_clause:order by子句决定了列值被拼接的顺序。
通过该用法,可以看出LISTAGG函数不仅可作为一个普通函数使用,也可作为分析函数。
order_by_clause和query_partition_clause的用法如下:

4.4.1普通函数

对工资进行排序,用逗号进行拼接。

SQL> select listagg(ename,',')within group(order by sal)name from emp;NAME
---------------------------------------------------------------------------------------------------
SMITH,JAMES,ADAMS,MARTIN,WARD,MILLER,TURNER,ALLEN,CLARK,BLAKE,JONES,FORD,SCOTT,KING

4.4.2 分组函数

SQL> select deptno,listagg(ename,',')within group(order by sal)name from emp group by deptno;DEPTNO NAME
---------- ----------------------------------------------------------------------------------------------------10 MILLER,CLARK,KING20 SMITH,ADAMS,JONES,FORD,SCOTT30 JAMES,MARTIN,WARD,TURNER,ALLEN,BLAKE

4.4.3 分析函数

SQL> select deptno,ename,sal,listagg(ename,',')within group(order by sal)over(partition by deptno)name from emp;DEPTNO ENAME             SAL NAME
---------- ---------- ---------- ----------------------------------------10 MILLER           1300 MILLER,CLARK,KING10 CLARK            2450 MILLER,CLARK,KING10 KING             5000 MILLER,CLARK,KING20 SMITH             800 SMITH,ADAMS,JONES,SCOTT,FORD20 ADAMS            1100 SMITH,ADAMS,JONES,SCOTT,FORD20 JONES            2975 SMITH,ADAMS,JONES,SCOTT,FORD20 SCOTT            3000 SMITH,ADAMS,JONES,SCOTT,FORD20 FORD             3000 SMITH,ADAMS,JONES,SCOTT,FORD30 JAMES             950 JAMES,MARTIN,WARD,TURNER,ALLEN,BLAKE30 MARTIN           1250 JAMES,MARTIN,WARD,TURNER,ALLEN,BLAKE30 WARD             1250 JAMES,MARTIN,WARD,TURNER,ALLEN,BLAKE30 TURNER           1500 JAMES,MARTIN,WARD,TURNER,ALLEN,BLAKE30 ALLEN            1600 JAMES,MARTIN,WARD,TURNER,ALLEN,BLAKE30 BLAKE            2850 JAMES,MARTIN,WARD,TURNER,ALLEN,BLAKE14 rows selected.

oracle中行列转换总结相关推荐

  1. ORACLE中行列转换的问题解决

    在论坛上看到一个问题,自己以前也遇到过,像是一个老友,又熟悉又陌生,内心愧疚,赶紧去实际验证,然后记录在这里给自己提个醒. 首先创建两张表A,B,并插入数据, create table A ( ID ...

  2. SQL Server中行列转换 Pivot UnPivot (转载)

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现PIVOT的一般语法是:PIV ...

  3. oracle中转换函数,Oracle中的转换函数

    Oracle中的转换函数有三个,分别为to_char(),to_date(),to_number() 1.to_char()的用法 格式化当前的日期时间 select sysdate,to_char( ...

  4. Oracle的行列转换

    转自:http://blog.csdn.net/xb12369/article/details/39554935 尝试SQL: 统计每天每个类型操作个用多少用户 select *   from (se ...

  5. oracle 字符转整数,Oracle中字符串转换函数小数转法

    Oracle中字符串转换函数小数转法 类别:Oracle数据库   作者:码皇   来源:薛凯博客     点击: Oracle中字符串转换函数小数转法 to_char()函数的字符串转换格式归纳如下 ...

  6. Oracle如何实现动态行列转换,Oracle实现行列转换的方法分析

    本文实例讲述了Oracle实现行列转换的方法.分享给大家供大家参考,具体如下: 1.固定列数的行列转换 如: sql;"> student subject grade -------- ...

  7. oracle10行转列,【转】oracle 10g 行列转换的写法

    11g中有更好的解决方式,有个pivot函数 1 假如有如下表,其中各个i值对应的行数是不定的SQL> select * from t; I A D ---- ---- ------- 1 b ...

  8. Oracle 的行列转换

    原表:student 原表:course 以下使用Max.Min.sum 都可以.. 1. 固定行列转换格式及方法: 1.1.Decode方式 select sno,SNAME, max(decode ...

  9. oracle中blob转换,BLOB转换为CLOB的函数(oracle中执行)

    BLOB转换为CLOB的函数(oracle中执行) CREATE OR REPLACE FUNCTION BlobToClob(blob_in IN BLOB) RETURN CLOB AS v_cl ...

最新文章

  1. 2016极客大奖颁奖盛典落幕 50个大奖勾勒中国创新图谱
  2. android服务器压力测试,Android压力测试Monkey工具
  3. Bytomd 助记词恢复密钥体验指南
  4. HDU 1009 - FatMouse' Trade (部分背包问题)
  5. Runloop底层原理--源码分析
  6. Educational Codeforces Round 107 (Rated for Div. 2) 题解
  7. qt同时连接oracle和mysql_QT连接Oracle和Mysql的详细步骤,已成功~!
  8. Elasticsearch了解多少,说说你们公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段 。
  9. 时间复杂度与空间复杂度小结
  10. android imagebutton 动画,Android中ImageButton的三种点击效果—点击变化,点一次换一张,逐帧动画的实现...
  11. MTK-EngineeMode-Hardware Testing
  12. 重新理解泰勒公式 牛顿法
  13. 猴子搬香蕉 php,猴子搬香蕉
  14. siblings筛选同胞元素
  15. 删除文件夹显示找不到该项目,也无法改名、移动等
  16. 机器学习算法 09-02 TensorFlow核心概念 TensorFlow基础代码、TensorFlow线性回归解析解和BGD求法
  17. 计算机ppt放映方式怎么改,ppt打开方式设置怎么设置
  18. ArcGIS10试用体验之安装篇
  19. Index || 测试质量分析指标(定量分析+定性分析:T-RCA缺陷根因分析法)
  20. 理解HTML HTTP API 和URL

热门文章

  1. 篮球,我即将跟你说再见(2)
  2. java中Scanner使用方法详细
  3. 用户不必了解计算机的内部结构,【单选题】用户不必了解计算机的内部结构,主要考虑解题算法和步骤,以过程为中心的编程思想,称为()语言...
  4. 临床医生眼中的五大高压科室,你入选了吗
  5. easyExcel 用XSSF画斜线
  6. Eclipse:Window -> Preferences中没有Server
  7. 解读至强的小秘密之 OpenVINO 工具套件,面向 AI 任务的 “神奇改造车间”
  8. 巧用FillForm注册QQ账号(QQ邮箱注册,QQ账号注册)
  9. Win10 备份与还原驱动
  10. 学习vi编辑器 —— 全局替换