oracle的wm_concat函数

本文介绍了如何利用WM_CONCAT函数在SQL中实现行转列,并解决了在数字转换为字符串时小数点前的0被省略的问题。通过添加额外的判断条件,确保了数据完整保留。此外,还展示了如何结合OVER和PARTITION BY函数对聚合后的数据进行排序,以达到预期的输出效果。
摘要由CSDN通过智能技术生成

我们可以通过wm_concat函数可以实现行转列:

 select s_info_windcode,rate from OptionEmbeddedBondRate where 
 s_info_windcode = '110031.SH'

目前库中的数据是如下图所示:
在这里插入图片描述

要转换成如下图所示的数据:
在这里插入图片描述
这时就可以通过wm_concat函数进行转换,具体sql如下:

select s_info_windcode,WM_CONCAT(rate) rate from OptionEmbeddedBondRate
WHERE s_info_windcode ='110031.SH'
GROUP BY s_info_windcode

上述结果集中会有一个问题,那就是在number类型转换成varchar类型时, .前面的0会被自动省略掉,为了解决这个问题,我们将参数rate做一下判断:

decode(substr((to_char(rate)),0,1),'.','0'||to_char(rate),to_char(rate))

最终的代码就如下所示:

select s_info_windcode,WM_CONCAT(decode(substr((to_char(rate)),0,1),'.','0'||to_char(rate),to_char(rate))) rate from OptionEmbeddedBondRate
WHERE s_info_windcode ='110031.SH'
GROUP BY s_info_windcode

下面则是最终聚集后的结果集:
在这里插入图片描述
当然,我们也可以为rate里面的数字集合做一个排序,当使用WM_CONCAT函数时,排序只能是先通过over(partition by … order by …)函数去做,然后再通过聚集函数max去取,具体的sql如下:

select s_info_windcode,MAX(to_char(M)) as RATE
	from (select 
			s_info_windcode,
			WM_CONCAT(decode(substr((to_char(rate)),0,1),'.','0'||to_char(rate),to_char(rate))) over(partition by s_info_windcode order by rate) m 
			from OptionEmbeddedBondRate 
			WHERE s_info_windcode ='110031.SH') 
	group by s_info_windcode;

具体的结果集如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值