项目中遇到一个小问题,就是在查询一个sql语句的时候需要将多行数据合并为一行,便于后台直接通过sql拿取数据,通过百度自己总结了如下实现 的两种方式,下面直接上干货。
原sql语句(简化的sql):
select
a.CLASSCODE,a.DEC001,a.DEC002,a.UNITCODE
from ZXYD_OP_COALLOGLINE a,ST_OPLOG b
where a.sid=b.sid and
b.sid='9468'
查询数据效果如下:
第一种方式,采用oracle自带的一个函数 wm_concat (支持Oracle10g,10g以上不支持,10g以上可以考虑使用listagg函数,这里不再多阐述)
select
wm_concat(a.DEC001) HDEC001,wm_concat(a.DEC002) HDEC002,wm_concat(a.UNITCODE) HJZ
from ZXYD_OP_COALLOGLINE a,ST_OPLOG b
where a.sid=b.sid and
b.sid=9468
group by CLASSCODE
查询数据效果如下:
但是在自己目前的实际业务中,这种以逗号分割的显示还是不太满足后台获取数据,还得自己写代码去解析,能不能直接将每一个字段都分开显示,每一个字段在sql中都定义好列名,这样就不用再去解析字段数据了
下面介绍第二种实现方式:
select a.CLASSCODE,
max(decode(a.UNITCODE,'#1',a.DEC001)) U1DEC001,
max(decode(a.UNITCODE,'#2',a.DEC001)) U2DEC001,
max(decode(a.UNITCODE,'#1',a.DEC002)) U1DEC002,
max(decode(a.UNITCODE,'#2',a.DEC002)) U2DEC002
from ZXYD_OP_COALLOGLINE a,ST_OPLOG b
where a.sid=b.sid and
b.sid='9468'
group by CLASSCODE
查询数据效果如下:
搞定,完美解决。