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实现行转列功能,并使用逗号进行隔开拼接,成为一条数据.pdf
理解日常工作中常用到的多列分组, 如【统计不同部门、 不同职位的平均工资】和 行转列 包含例子 和 个人理解分析
DB2 SQL 通过函数(CONCAT/POSSTR/LOCATE)实现行转列,列转行 可以按照标点把多列转换为一行,多行转换为一列
Oracle中使用语句将行数据转换称不同的列表示,或者将不同的列数据写到同一列的不同行上的行列转换问题是一个非常传统的话题。 网络上流传了很多将行数据转换称列数据的方法和应用实例,一般通过decode或者case函数...
主流数据(ORACLE,DB2)行转列实例,包括2种实现方式,通过case..when和left join..on;大牛补充其他的实现方式。
表中数据多行转1行多列
oracle 全文检索 oracle全文索引 多列字段检索,匹配多列字段搜索功能。
1.列出至少有一个员工的所有部门。 2.列出薪金比“SMITH”多的所有员工。 3.列出所有员工的姓名及其直接上级的姓名。 4.列出受雇日期早于其直接上级的所有员工。 5.列出部门名称和这些部门的员工信息,同时列出...
oracle 查询列最大值,例如有n例值,但是要找出这些列中的最大值。
oracle某个字段多行记录转化为一行,oracle某个字段多行记录转化为一行。
介绍了将多行转为字符串的三种方案,并比较了三种方案的执行效率. 1.sys_connect_by_path + start with ... connect by ... prior + 分析函数 2.自定义Function/SP 3.使用 Oracle 10g 内置函数 wmsys.wm_concat
oracle 某列存儲的值是有逗號的字符串,希望通過逗號分隔開來顯示多行。sql,有預期結果,有項目實戰。
SQL语句用with将列分割成多列存为临时表,再将多行某个字段拼接合并为一行
那么,现在如果给出一个权限编号,要去检索出用后这个权限的用户集合,就会需要在逗号分隔的多个权限编号中去匹配给出的这个权限编号。如果使用like去做,一则效率不高,二则匹配不精确。因此用到了逗号分隔列转行的...
java调用oracle输出参数为多行多列的结构化数组的存储过程,并将其遍历解析;该demo部署后,只需要配置poolman.xml数据源,即可运行;
oracle查询表的所有列并用逗号隔开
oracle游标使用大全,其中有很多例子,有助于大家理解,希望对初学者有帮助
网上有也只是提示性,没人有我这么厚道的了. C#中DataGridView显示Oracle数据库多个表的列,并導出Excel. 更改列标题、列自适应、列标题与内容居中等.