Teradata 行转列合并 逗号分隔 XMLAGG

需要查TD的表实现这个需求

 --> 
查了一下有说用 TDStats.udfConcat 的,试了一下 可能没有这个函数的权限用不了.
后来找到了 XMLAGG函数,给的样例是下面这样的

select 
    RQ,
    TRIM(TRAILING ',' FROM (XMLAGG(JX || ',')(VARCHAR(500))))
from table
group by RQ

拆解分析步骤如下:

1 核心函数:XMLAGG([要拼接的字段])

select
    RQ,XMLAGG(JX)
from table
group by RQ

查询报错了 , 错误分析原因为 XML类型是LOB类型,最多一行占用4096个字节 , 不能直接显示为LOB类型,

手动将JX这列格式化成varchar , 使用cast(xxx as varchar(500))

select
    RQ,cast(XMLAGG(JX) as varchar(500))
from table
group by RQ

结果报错 : 强制转换函数的参数必须具有相同的字符数据类型。

在后面加上(VARCHAR(500)) , (PS:不知道为什么cast不行 留个坑以后填)

select
    RQ,XMLAGG(JX)(VARCHAR(500))
from dm_dp_hb_hxhb
group by RQ

查询结果为: 

想把中间的空格替换掉 ,改成逗号 , 没找到对应的方法 , XMLAGG参考里也没有 (留个坑以后填)

所以先在值的后面手动拼接一个 "," , SQL如下

select
    RQ,XMLAGG(JX || ',')(VARCHAR(500))
from (select distinct RQ,JX from dm_dp_hb_hxhb)t
group by RQ

查询结果为:


2 TRIM去掉最后的逗号

TRIM(TRAILING ',' FROM (     ))  

TRIM ( [ [位置] [要移除的字串] FROM ] 字串): [位置] 的可能值为 LEADING (起头), TRAILING (结尾), or BOTH (起头及结尾)。 这个函数将把 [要移除的字串] 从字串的起头、结尾,或是起头及结尾移除。如果我们没有列出 [要移除的字串] 是什么的话,那空白就会被移除。

最终SQL为:

select
    RQ,TRIM(TRAILING ',' FROM (XMLAGG(JX || ',')(VARCHAR(500))))
from table
group by RQ

 

 

TDStats.udfConcat 参考:

https://blog.csdn.net/weixin_30896763/article/details/95514322

XMLAGG参考

https://stackoverflow.com/questions/45306260/concatenate-strings-from-multiple-records-in-teradata-sql

TRIM参考

https://www.1keydata.com/cn/sql/sql-trim.php

ORACLE-XMLAGG参考

https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/XMLAGG.html#GUID-BCD1D755-5E26-4F73-BA22-521C30D275DA

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值