`
Eric.Yan
  • 浏览: 323266 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ORACLE行转列(行转1列,行转多列)

阅读更多

listagg
在oracle 11g release 2 版本中新增的listagg函数,listagg是一个实现字符串聚合的oracle内建函数;
listagg(column,'分隔符') within group (order by column) over(partition by column)
分隔符可以为空,
order by必选项,可以order by null

(1)select status,  listagg(risk_id, ',') within group (order by risk_id) from rp_risk group by status;
以status分组,将risk_id全部合并显示在一行
(2)与许多的聚合函数类似,listagg通过加上over()子句可以实现分析功能
select risk_id, status, listagg(risk_id, ',') within group (order by risk_id) over(partition by status) from rp_risk;
选出与当前risk_id在同一个部门的所有risk_id并合并字符串
(3)listagg聚合的结果列大小限制在varchar2类型的最大值内(比如4000);
(4)合并字符串也可以用wm_concat(column_name),所有版本的oracle都可以用这个函数
 listagg()是oracle 11g release 2才有;
(5)参考链接

http://xpchild.blog.163.com/blog/static/10180985920108485721969/

 

--listagg(合并多行的值为字符串,只用一列来显示)
select status, count(*),  listagg(risk_id, ',') within group (order by risk_id) from rp_risk group by status;
select risk_id, status, listagg(risk_id, ',') within group (order by risk_id) over(partition by status) from rp_risk;
select risk.risk_id, listagg(officer.last_name || ',' || officer.first_name, '; ') within group(order by null) from rp_risk risk, rp_risk_area_ref re, rp_risk_area area, rp_risk_officer officer 
where risk.risk_id = re.risk_id
and re.risk_area_id = area.risk_area_id(+)
and area.risk_officer_id = officer.risk_officer_id(+)
group by risk.risk_id;


--pivot(行专列,将多行的值改为多列显示)(for in的那个column,是某个列的值,也就是将某个列的值作为新的列的column,这个column下边的值好像只能来自一列)
select * from 
  (select risk.risk_id, re.risk_area_order, officer.last_name || ',' || officer.first_name fullname 
  from rp_risk risk, rp_risk_area_ref re, rp_risk_area area, rp_risk_officer officer 
  where risk.risk_id = re.risk_id
  and re.risk_area_id = area.risk_area_id(+)
  and area.risk_officer_id = officer.risk_officer_id(+) order by risk.risk_id desc, re.risk_area_order)
  pivot(max(fullname) for risk_area_order in (1 primaryOfficer, 2 addtionalOffcier1, 3 addtionalOffcier2)) order by risk_id desc;


--decode(行专列,将多行的值改为多列显示)(decode的那个column,是某个列的值,也就是将某个列的值作为新的列的column,MAX聚集函数也可以用sum、min、avg等其他聚集函数替代)
select risk_id, 
--max(decode(risk_area_order, 1, fullname)) primaryOfficer,
--max(decode(risk_area_order, 2, fullname)) addtionalOffcier1,
--max(decode(risk_area_order, 3, fullname)) addtionalOffcier1
min(decode(risk_area_order, 1, fullname)) primaryOfficer,
min(decode(risk_area_order, 2, fullname)) addtionalOffcier1,
min(decode(risk_area_order, 3, fullname)) addtionalOffcier1
from 
  (select risk.risk_id, re.risk_area_order, officer.last_name || ',' || officer.first_name fullname from rp_risk risk, rp_risk_area_ref re, rp_risk_area area, rp_risk_officer officer 
  where risk.risk_id = re.risk_id
  and re.risk_area_id = area.risk_area_id(+)
  and area.risk_officer_id = officer.risk_officer_id(+) order by risk.risk_id, re.risk_area_order)
group by risk_id order by risk_id;

 

 参考链接:

比较全面的:

http://blog.sina.com.cn/s/blog_010630c30100fdyp.html

http://blog.csdn.net/kingston001/article/details/7949629

关于pivot的:

http://www.oracle.com/technetwork/cn/articles/11g-pivot-101924-zhs.html

关于wm_concat的:

http://blog.csdn.net/jwlsky/article/details/7619819

http://www.cnblogs.com/8765h/archive/2012/01/14/2374378.html

 

 

分享到:
评论

相关推荐

    oracle动态行转列

    本文将深入探讨如何通过Oracle中的存储过程实现动态“行转列”,并结合给定文件的信息,详细解析其工作原理、优点及应用场景。 ### 核心知识点:Oracle动态行转列 #### 1. 存储过程与动态SQL 存储过程是预编译的...

    oracle行转列

    首先,"行转列"的基本思想是将数据库表中的一列数据转换为多列显示,使得数据在展示时更加清晰、直观。Oracle提供了多种方法来实现这一目标,包括使用Pivot和Unpivot操作,以及自定义的SQL查询技巧。 1. PIVOT操作...

    Oracle行转列

    Oracle行转列 Oracle行转列是指在Oracle数据库中将行数据转换为列数据或将列数据转换为行数据的操作。这种操作在实际应用中非常有用,例如,在数据报表、数据分析和数据挖掘等领域都需要使用行转列操作。 1. 列...

    oracle 行转列

    其中,“行转列”是一种常见的数据处理方式,它指的是将原本存储在多行中的数据转化为单行中的多个字段。这种数据转换方式在报表生成、数据分析等领域非常有用。 #### 二、固定列数的行转列方法 当待转换的列是...

    oracle实现行转列功能,并使用逗号进行隔开拼接,成为一条数据.pdf

    Oracle 实现行转列功能并使用逗号进行隔开拼接成为一条数据 Oracle 中实现行转列功能,并使用逗号进行隔开拼接,成为一条数据是指将多行数据合并成一行数据,并用逗号分隔每个字段的值。这种功能在实际应用中非常...

    oracle行转列聚合函数WMSYS.WM_CONCAT

    ### Oracle行转列聚合函数WMSYS.WM_CONCAT详解 #### 一、概述 在进行数据处理时,经常会遇到需要将多行数据合并为单行的情况,这通常被称为“行转列”。Oracle数据库提供了多种方法来实现这一需求,其中`WMSYS.WM_...

    oracle 多列分组和行转列 理解和实例

    理解日常工作中常用到的多列分组, 如【统计不同部门、 不同职位的平均工资】和 行转列 包含例子 和 个人理解分析

    Oracle的列转行问题

    列转行(Pivot)和行转列(Unpivot)是两种基本操作,可以将数据按照不同的维度进行组织。传统的列转行方法通常涉及`DECODE`或`CASE`函数与聚合函数如`MAX`或`MIN`的结合,但这些方法可能在处理大量数据时对性能造成...

    DB2 SQL 实现行转列,列转行

    DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列

    主流数据库行转列实例

    主流数据(ORACLE,DB2)行转列实例,包括2种实现方式,通过case..when和left join..on;大牛补充其他的实现方式。

    游标分类汇总行转列oracleplsql

    行转列(Pivot)是一种将表格中的一列或多列转换为多行的操作,通常用于将一列中的不同值分别转换为表中的单独列。在Oracle中,可以使用 `PIVOT` 函数来实现这一操作。但是,在示例代码中,并没有直接使用 `PIVOT` ...

    sql动态行转列 存储过程

    `PIVOT`是Oracle数据库特有的行转列函数,而`CASE`语句则在大多数SQL方言中可用。 3. **执行动态SQL**:使用`EXEC`或`sp_executesql`(在SQL Server中)来执行动态构建的SQL语句。 4. **处理结果**:存储过程可以...

    ORACLE 列转行 DECODE函数用法

    DECODE函数在处理列转行的问题时,尤其适用于将多列数据合并到一行中,使得数据展示更加简洁明了。下面我们将详细讲解DECODE函数的使用方法以及如何在列转行操作中应用它。 DECODE函数的基本语法如下: ```sql ...

    Oracle行变列-存储过程

    Oracle数据库中的"行变列"技术是指将数据库中原本存储为多行的数据转换为单行的列式展示,这在数据分析、报表制作等场景中非常常见。存储过程是Oracle数据库中预编译的PL/SQL代码块,可以执行一系列复杂的数据库操作...

    Oracle行列转换

    这在你需要将一组相关的列合并为一个或多个行时非常有用。基本语法如下: ```sql SELECT column1, unpivot_column, value FROM table UNPIVOT ( value FOR unpivot_column IN (column2, column3, ...) ); ``` 在...

Global site tag (gtag.js) - Google Analytics