我将这些数据放在一个表中:
ID ANIMAL
555000 Dog
555000 Cow
555000 Fox
657000 Fox
817900 Dog
817900 Fox
829800 Fox
830300 Fox
830600 Fox
830800 Fox
831100 Dog
831100 Fox
839900 Fox
我需要创建按ID分组的输出,然后创建Id动物的分隔字符串。鉴于上述数据,我需要以下输出。请注意,每个ID应该是结果集中的单个行,并且动物应该连接成每个ID的单个字符串。我不打算创建一个大的连接字符串。
555000 Dog<br/>Cow<br/>Fox
657000 Fox
817900 Dog<br/>Fox
829800 Fox
830300 Fox
830600 Fox
830800 Fox
831100 Dog<br/>Fox
839900 Fox
这是我到目前为止的SQL。它为每个ID,ANIMAL组合生成一行。问题是ANIMAL字段中的值没有被连接。我做错了什么?
select ID,
REPLACE (wm_concat (DISTINCT ANIMAL),',','<br/>')
from TheTable
group by ID, ANIMAL
答案 0 :(得分:1)
使用LISTAGG分析函数:
SELECT ID, LISTAGG(ANIMAL, '<br/>') WITHIN GROUP (ORDER BY ANIMAL) animals
FROM TheTable
GROUP BY ID;
注意:您将被限制为4000 字节。
编辑:
字符串聚合技术有很好的资源:
https://oracle-base.com/articles/misc/string-aggregation-techniques#user_defined_aggregate_function
答案 1 :(得分:0)
一种方法是使用XMLAGG / XMLELEMENT
而不是LISTAGG
(这将避免可怕的ORA-01489:字符串连接的结果太长):
select ID,
RTRIM(XMLAGG(XMLELEMENT(E,
t.animal || ',')).EXTRACT('//text()').getclobval(),
',') as animals
from theTable t
group by ID
此
XMLELEMENT
)XMLAGG
和字符串连接运算符||
EXTRACT
和getClobVal()
RTRIM
XMLCAST
代替EXTRACT
/ getClobVal
时,IIRC会有一种更优雅的方式,但我现在无法访问我的代码库来检查它。