gpt4 book ai didi

sql - Oracle 10g 中的聚合字符串连接

转载 作者:行者123 更新时间:2023-12-01 02:21:28 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Is there any function in oracle similar to group_concat in mysql? [duplicate]

(1 个回答)


7年前关闭。




我看到了上一个问题,其中表格包含“No”和“Name”列,以及其他与数字列分组的问题,但无法实现为我的案例提供的答案。我需要做同样的事情,但使用非数字分组。源表是 tbl1 与这些列:

POD    Name
--- -----
North Rony
North James
North Aby
South Sam
South Willy
West Mike

我需要做这个聚合:
POD    Name
--- -----
North Aby,James,Rony
South Sam,Willy
West Mike

由于“POD”是非数字的,Msyma、Dinup 和 chetan 以前的解决方案似乎对我不起作用。

我不知道如何从他们对这些要求的回答中进行知识转移。

一个理想的查询是
SELECT POD, AGGREGATESTRING(Name)
FROM tbl1
GROUP BY POD

在理想的例子中, AGGREGATESTRING 不会对人名进行排序,但我想我可以在需要的地方插入“ORDER BY”。

最佳答案

Oracle 11g 具有这个简洁的函数 LISTAGG,这几乎是您想要的,但是由于您使用的是 10g,因此您无法使用它(除非您决定升级)。

如果由于某种原因您不希望(或由于任何原因不能)升级到 11g,我建议您查看 10g 上可用的 LISTAGG 的一些替代方案。

您可以查看一些建议的替代方案 here

快速调整对建议的替代方案之一的快速调整以匹配您的案例场景:

WITH Q AS
(
SELECT 'North' POD, 'Rony' NAME FROM DUAL UNION ALL
SELECT 'North', 'James' FROM DUAL UNION ALL
SELECT 'North', 'Aby' FROM DUAL UNION ALL
SELECT 'South', 'Sam' FROM DUAL UNION ALL
SELECT 'South', 'Willy' FROM DUAL UNION ALL
SELECT 'West', 'Mike' FROM DUAL
)
SELECT POD,
RTRIM(
XMLAGG (XMLELEMENT(e, name||',') ORDER BY name).EXTRACT('//text()'),
','
) AS name
FROM q
GROUP BY POD;

但请记住,这不是实际的解决方案,因为您必须根据您的表(而不是虚拟的 DUAL 表)等进行定制...

您的解决方案可能看起来像以下内容:
SELECT   POD,
RTRIM(
XMLAGG (XMLELEMENT(E, NAME||',') ORDER BY NAME).EXTRACT('//text()'),
','
) AS NAME
FROM tbl1
GROUP BY POD;

如果要更改分隔符,可以在此部分中从逗号更改它:
(E, NAME||',')

RTRIM 只是为了从连接字符串的末尾剪掉尾随逗号,如果您不受尾随逗号的困扰,您可以省略 RTRIM 函数以保持可读性。

关于sql - Oracle 10g 中的聚合字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20190598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com