Oracle 多行记录合并

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 多行记录合并相关的知识,希望对你有一定的参考价值。

现在有三个表:

1. 表1: company
cid cname
1 C1
2 C2
...

2. 表2: user
uid uname
1 U1
2 U2
...

3. 关联表3:company_user
id cid uid position
1 1 1 P1
2 1 1 P2
3 1 1 P3
4 1 2 P1
5 1 2 P2
....

要求条件查询cid为1时按user合并的查询结果如下:
cid uid uname postion1 postion2 postion3
1 1 U1 P1 P2 P3
2 2 U2 P1 P2

请各位大虾指教!

--1)按照你提供的表结构和最终需求似乎不需要 表1: company
--2)按照你的要求结果集中列的数量似乎不能确定,所以ORCLE不能完成这个查询,但是有一个
--wmsys.wm_concat函数可以完成类似功能,请参照下面SQL:

SELECT DISTINCT X.cid,X.uid,X.uname,wmsys.wm_concat(X.position) over (partition by X.uname) AS position
FROM (
SELECT company_user.cid,company_user.uid,user.uname, company_user.position
FROM user,company_user
WHERE user.uid = company_user.uid
AND company_user.cid=1
) X

------------预计执行结果-----------------------------------------------------

cid uid uname postion
1 1 U1 P1,P2,P3
2 2 U2 P1,P2

------------结果说明-----------------------------------------------------------
--结果集中postion字段的结果是所有company_user表中满足条件的集合,
--形成一个由逗号分割的字符串

希望能够对你有帮助.如果有问题可以追问
参考技术A select
company_user.cid,
company_user.uid,
user,uname,
decode(sign(sum(decode(company_user.position,'P1',1,0))),1,'P1',null) position1,
decode(sign(sum(decode(company_user.position,'P1',1,0))),1,'P2',null) position2,
decode(sign(sum(decode(company_user.position,'P1',1,0))),1,'P3',null) position3
from company, user, company_user
where 1=1
and company_user.cid=company.cid
and company_user.uid=user.uid
group by company_user.cid,company_user.uid,user,uname;追问

你说的是position的值是固定的情况,但现在这个position完全是由用户自己填写的,根本不知道是哪些值,例子中的P1, P2, P3只是个示例而已。这种情况怎么办啊?先谢过了!

追答

这种情况单纯靠sql语句是实现不了的,要么创建一个procedure,根据实际条件,动态创建sql语句,然后将结果写到文件中;要么利用工具,比如,oracle reports 有一个矩阵报表,非常符合你的需求。

参考技术B select * from company_user cu

left join user u
on cu.uid=u.uid
left join company c
on cu.cid =c.cid

如何将Oracle中同一列的多行记录拼接成一个字符串

1、新建php文件。

2、声明数组变量。

3、用implode函数使数组拼接成字符串,连接符为-。

4、输出连接后的字符串。

5、预览效果如图。

6、用implode函数使数组拼接成字符串,连接符为?。

7、预览效果如图。

参考技术A

需要用wm_concat函数来实现。

如目前在emp表中查询数据如下:

要按照deptno相同的将ename以字符串形式合并,可用如下语句:

select deptno,wm_concat(ename) from emp group by deptno;

查询结果:

参考技术B 我们常常说 用SQL将Oracle中同一列的多行记录拼接成一个字符串是如何实现的:[sql]-- 原始数据-- a 111-- b 222-- a 333-- a 444-- b 555-- 最终结果-- a 111*333*444SELECTL4.L_TIME,MAX(SUBSTR(L4.分组内容,2)) 最终字段值FROM(SELECTL3.L_TIME,SYS_CONNECT_BY_PATH(L3.L_CONTENT,'*') AS 分组内容FROM(SELECTL2.L_TIME,L2.L_CONTENT,L2.L_TIME||L2.分组内编号 AS 分组字段加编号,L2.L_TIME||(L2.分组内编号-1) AS 上级分组字段加编号FROM(SELECTL1.L_TIME -- 分组依据,L1.L_CONTENT -- 同一列中 要合并的不同行 的值,ROW_NUMBER() OVER (PARTITION BY L1.L_TIME ORDER BY L1.L_CONTENT ASC) 分组内编号FROM LOGS L1) L2) L3START WITH L3.上级分组字段加编号 LIKE '%0'CONNECT BY PRIOR L3.分组字段加编号=L3.上级分组字段加编号) L4WHERE L_TIME='111'GROUP BY L4.L_TIME-- ROW_NUMBER() OVER(PARTITION BY A ORDER BY B DESC) 新列名-- 根据A分组,在分组内部根据B排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)-- SYS_CONNECT_BY_PATH 函数: 第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符-- CONNECT BY PRIOR 是标示父子关系的对应-- START WITH 代表你要开始遍历的的节点本回答被提问者采纳 参考技术C with temp as(
  select 'China' nation ,'Guangzhou' city from dual union all
  select 'China' nation ,'Shanghai' city from dual union all
  select 'China' nation ,'Beijing' city from dual union all
  select 'USA' nation ,'New York' city from dual union all
  select 'USA' nation ,'Bostom' city from dual union all
  select 'Japan' nation ,'Tokyo' city from dual
)
SELECT nation,listagg(city) within GROUP(ORDER BY city)
FROM temp
Group BY Nation;

参考技术D 使用CURSOR循环拼接即可!

以上是关于Oracle 多行记录合并的主要内容,如果未能解决你的问题,请参考以下文章

利用Oracle分析函数实现多行数据合并为一行

如何将Oracle中同一列的多行记录拼接成一个字符串

sqlServer 多行合并为一行

如何实现oracle一次更新多行记录

oracle sql 合并问题

Oracle 插入多行记录