在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行转列(行转1列,行转多列)的更多相关文章

  1. codeforces 724B Batch Sort(暴力-列交换一次每行交换一次)

    题目链接:http://codeforces.com/problemset/problem/724/B 题目大意: 给出N*M矩阵,对于该矩阵有两种操作: (保证,每行输入的数是 1-m 之间的数且不 ...

  2. PIVOT就是行转列,UNPIVOT就是列传行

    PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合.UNPIVOT与PIVOT执行相反的操作,将表值表达式的列转换为列值. 通 ...

  3. sql server显示某一列中有重复值的行

    sql server查询一张表 ,显示某一列中有重复值的行,可以这样写: Select * From 表名 where 列名 in(Select 列名 From Table group by 列名 h ...

  4. python excel操作 练习-#操作单列 #操作A到C列 #操作1到3行 #指定一个范围遍历所有行和列 #获取所有行 #获取所有列

    ##操作单列#操作A到C列#操作1到3行#指定一个范围遍历所有行和列#获取所有行#获取所有列 #coding=utf-8 from openpyxl import Workbook wb=Workbo ...

  5. 重新认识HBase,Cassandra列存储——本质是还是行存储,只是可以动态改变列(每行对应的数据字段)数量而已,当心不是parquet

    行先是以一种非常独特的方式被索引,随后Bigtable利用行键对数据进行分割,将它们分布到集群中.列可以被迅速地定义在行中,让Bigtable适用于大多数的非模式环境. 数据在表面上最初是由行进行排列 ...

  6. [译] Pandas中根据列的值选取多行数据

    # 选取等于某些值的行记录 用 == df.loc[df['column_name'] == some_value] # 选取某列是否是某一类型的数值 用 isin df.loc[df['column ...

  7. 合并table中某一列相邻的相同的行

    合并table中某一列相邻的相同的行​1. [代码]合并table中某一列相邻的相同的行  <!DOCTYPE html><html>    <head>      ...

  8. pandas中根据列的值选取多行数据

    # 选取等于某些值的行记录 用 == df.loc[df['column_name'] == some_value] # 选取某列是否是某一类型的数值 用 isin df.loc[df['column ...

  9. 解析oracle的rownum,数据库查询结果返回行数设置

    对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀 ...

  10. oracle 查询数据一直提示:“error code [17004]; 无效的列类型”111111

    oracle 查询数据一直提示:“error code [17004]; 无效的列类型”111111 问题场景:oracle,jpa,insert原因:插入的字段中有null.导致类型转换出问题,这个 ...

随机推荐

  1. $(document).ready(function(){})和window.onload=function(){}的比较

    这两个函数想必每个前端开发者都不会很陌生,但是很了解用法的人估计就比较少了,博主也是最近才开始注意到这两个函数的区别. 首先$(document).ready(function(){})等同于$(). ...

  2. String()与toString()区别和应用

    首先,String()和toString()方法都是将其它类型的变量转换为字符串的方法.但两者存在一定的区别: x.toString(): 无法转换null和undefined: 来看下面的小例子: ...

  3. 在JS中调用JAVA变量

    在JS中调用JAVA变量可以,方法是:var JS变量名 = “<%=JAVA变量名 %>”<%中间写java代码,跟在JSP中一样%>在JAVA中 ,无法调用JS变量

  4. NodeJS和C++的性能比较(转)

    原文地址: http://www.web-tinker.com/article/20374.html 前段时间做了个实验,测试了1E9次的空循环在NodeJS和C++中的执行用时.于是我和小伙伴们瞬间 ...

  5. 为编写网络爬虫程序安装Python3.5

    1. 下载Python3.5.1安装包1.1 进入python官网,点击menu->downloads,网址:https://www.python.org/downloads/ 1.2 根据系统 ...

  6. BC 65 game

    主持人一直某个数字在1到n范围,假设甲乙已经知道,甲先猜乙后,都采用最优策略,主持人说偏大还是偏小,不断缩小范围,问最后乙能会获胜的X的取值的个数. 如果n为奇数,那么仅当x=n/2乙必然获胜,若为奇 ...

  7. WordPress教程之判断文章所属分类函数in_category、is_category

    最近自己在修改一个采用Wordpress程序的博客的时候需要用到一个特殊的功能:我需要判断这篇文章是属于哪些分类,如果属于我设定的分类下的文章,则输出一个DIV内容.按道理说实现这个功能应该不算太难, ...

  8. SQL排除重复结果只取字段最大值

    如何用SQL排除重复结果只取字段最大值的记录?要求得到的结果(即是PID相同的记录只取ID值最大的那一条). select * from [Sheet1$] a from [Sheet1$] wher ...

  9. NOI十连测 第四测 T2

    思路:线段树套可持久化treap,可持久化treap我还是第一次听说.. 改题的时候没看数据范围..乱开数组T_T #include<algorithm> #include<cstd ...

  10. WPF笔记(2.3 StackPanel)——Layout

    原文:WPF笔记(2.3 StackPanel)--Layout StackPanel用于小规模的排版布局,比如说一个局部下几个textbox和Button啦.Orientation属性有Vertic ...