oracle实现行转列功能,并使用逗号进行隔开拼接,成为一条数据
有两种方式
1、第一种:使用WM_CONCAT函数,不过这个函数已经被oracle弃用了,不建议使用,如果数据库中还有这个函数也可以使用
select sfc_no,wm_concat(mark_operation_id) from bp_marking where create_date>sysdate-1/24 group by sfc_no
简单说一下就是查询bp_marking表中的sfc_no与对应的所有的mark_operation_id的字段,并且合并到一列中
结果显示如下:
实现去重:就是把重复的去掉
直接加一个distinct即可
select sfc_no,wm_concat(distinct mark_operation_id) from bp_marking where create_date>sysdate-1/24 group by sfc_no
具体使用方式参考:https://www.cnblogs.com/yujin595/p/9829821.html
如果没有这个函数也想添加的话,可以试一下如下的方法(具体是否能用我没试过)
https://www.cnblogs.com/YuyuanNo1/p/7910714.html
2、第二种:使用LISTAGG函数
select sfc_no,LISTAGG(mark_operation_id,',') within group (order by mark_operation_id) from bp_marking where create_date>sysdate-1/24 group by sfc_no
结果跟上面的结果是一样的。
具体使用参考:https://blog.csdn.net/defonds/article/details/80455816
如何实现去重:
把表再嵌套一层即可。即先把重复的数据去掉,然后再对这个表进行listagg操作。
select sfc_no,LISTAGG(mark_operation_id,',') within group (order by mark_operation_id) from (select distinct sfc_no,mark_operation_id from bp_marking where create_date>sysdate-1/24) group by sfc_no
执行完之后有时候会显示字符串连接过长的问题,因为listagg设定的字符串长度只有4000,超过4000就会报错。具体处理方法暂时也不清楚。