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
请各位大虾指教!
--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 culeft 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 '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 多行记录合并的主要内容,如果未能解决你的问题,请参考以下文章