Oracle10g 在oracle 10g中将行转换为列
我想使用JOIN将oracle 10g中的行转换为列。我不想使用DECODE或XMLAGG函数。我的表格结构如下:Oracle10g 在oracle 10g中将行转换为列,oracle10g,rows,transpose,Oracle10g,Rows,Transpose,我想使用JOIN将oracle 10g中的行转换为列。我不想使用DECODE或XMLAGG函数。我的表格结构如下: GROUP_ID ENTITYID GROUP_ENTITYID 1 A997 A995 2 A997 A993 3 A997 A990 4 A988 A987 5 A988 A982 6
GROUP_ID ENTITYID GROUP_ENTITYID
1 A997 A995
2 A997 A993
3 A997 A990
4 A988 A987
5 A988 A982
6 A988 A980
7 A979 A975
8 A979 A974
9 A979 A973
我希望获得以下格式的数据:
ENTITYID GROUP_ENTITYID
A979 A979,A975,A974,A973
A988 A988,A987,A982,A980
A997 A997,A995,A993,A990
你们能告诉我怎么做吗
提前感谢。蒂姆·霍尔(Tim Hall)提供了各种产品的标准清单 使用联接来组合数据既不实用也不高效。如果您碰巧知道
EntityID
将映射到另外三个Group\u EntityID
值,则可以使用联接
SELECT a.entity_id,
a.entity_id || ',' ||
a.group_entityID || ',' ||
b.group_entityID || ',' ||
c.group_entityID
FROM table_name a,
table_name b,
table_name c
WHERE a.entityID = b.entityID
AND a.entityID = c.entityID
AND a.group_entityID > b.group_entityID
AND b.group_entityID > c.group_entityID
但是,如果与特定EntityID
相关的Group\u EntityID
值的数量发生变化,那么这种方法既不是特别有效,也不是特别灵活
我通常更喜欢创建用户定义的聚合函数(Tim清单中的选项之一)并执行以下操作
SELECT entityID, entityID || ',' || string_agg( group_entity_id )
FROM table_name
GROUP BY entityID;
如果您想在不创建任何其他对象或函数的情况下执行此操作,可以在Tim的站点上使用SYS\u CONNECT\u BY\u PATH
方法
SQL> ed
Wrote file afiedt.buf
1 with x as (
2 select 1 group_id, 'A997' entityID, 'A995' group_entityID from dual union all
3 select 2, 'A997', 'A993' from dual union all
4 select 3, 'A997', 'A990' from dual union all
5 select 4, 'A998', 'A987' from dual union all
6 select 5, 'A998', 'A982' from dual union all
7 select 6, 'A998', 'A980' from dual union all
8 select 7, 'A979', 'A975' from dual union all
9 select 8, 'A979', 'A974' from dual union all
10 select 9, 'A979', 'A973' from dual
11 )
12 select entityID,
13 entityID || ',' ||
14 ltrim( max( sys_connect_by_path( group_entityID, ','))
15 keep(dense_rank last order by group_id),
16 ',') group_entityID
17 from (select group_id,
18 entityID,
19 group_entityID,
20 row_number() over (partition by entityID
21 order by group_id) curr,
22 row_number() over (partition by entityID
23 order by group_id) - 1 prev
24 from x)
25 group by entityID
26 connect by prev = PRIOR curr
27 and entityID = PRIOR entityID
28* start with curr = 1
SQL> /
ENTI GROUP_ENTITYID
---- ------------------------------
A979 A979,A975,A974,A973
A997 A997,A995,A993,A990
A998 A998,A987,A982,A980
嗨,贾斯汀,谢谢你的回复。你的询问对我没有帮助。因为正如您已经猜到的,与特定EntityID关联的Group_EntityID值的数量会有所不同。实际上,我想使用XMLAGG函数。但是我对这个函数不是很确定。该功能在任何环境中都可用吗?它是否需要安装任何可能不会安装在不同环境中的组件?@SomnathGuha-我发布的两个查询都没有帮助?你看过Tim页面上的其他字符串聚合技术了吗?他们都不为你工作吗?你能解释一下为什么它们不起作用吗?我想在理论上你可以使用
XMLAGG
,但这似乎比其他方法更复杂,没有明显的好处,除非你真的喜欢生成和解析XML。@Juntin这两种查询我都试过了。第一个查询对我没有用处,因为对于一个特定的entityid,可能有n个组\u entityid。但您的查询只返回3个组实体ID。对于下一个查询,它向我显示string_agg invalid function error messgae。我已经看过蒂姆的解决方案了。我相信这会对我有用。但我只是想用sql解决这个问题query@SomnathGuha-如果要使用用户定义的聚合函数,则需要定义该函数(正如Tim在其页面上所做的那样)。如果希望它是单个查询而不创建任何其他对象或函数,可以使用行号和SYS\u CONNECT\u BY\u PATH方法Tim defined()。SYS\u CONNECT\u BY\u PATH是否需要任何特殊权限,或者对所有类型的用户都可用?