- -- 原始数据
- -- a 111
- -- b 222
- -- a 333
- -- a 444
- -- b 555
- -- 最终结果
- -- a 111*333*444
-
第一种方案: -
SELECT
L4.BL_NO,L4.SAILING_DT,L4.VESSEL_CD,L4.VOYAGE,L4.CURRENCY_CD
,MAX(SUBSTR(L4.分组内容,2)) 最终字段值
,MAX(SUBSTR(L4.分组2,2)) 最终字段值
FROM(
SELECT
L3.BL_NO,L3.SAILING_DT,L3.VESSEL_CD,L3.VOYAGE,L3.CURRENCY_CD
,SYS_CONNECT_BY_PATH(L3.FEE_CD,'*') AS 分组内容
,SYS_CONNECT_BY_PATH(L3.BL_MSG,'*') AS 分组2
FROM(
SELECT
L2.BL_NO,L2.SAILING_DT,L2.VESSEL_CD,L2.VOYAGE,L2.CURRENCY_CD
,L2.FEE_CD,L2.BL_MSG
,L2.BL_NO||L2.分组内编号 AS 分组字段加编号,L2.BL_NO||(L2.分组内编号-1) AS 上级分组字段加编号
FROM(
SELECT
distinct L1.BL_NO,L1.SAILING_DT,L1.VESSEL_CD,L1.VOYAGE,L1.CURRENCY_CD -- 分组依据
,L1.FEE_CD
,L1.BL_MSG -- 同一列中 要合并的不同行 的值
,ROW_NUMBER() OVER (PARTITION BY
L1.BL_NO,L1.SAILING_DT,L1.VESSEL_CD,L1.VOYAGE,L1.CURRENCY_CD
ORDER BY L1.FEE_CD,L1.BL_MSG ASC) 分组内编号
FROM t_eir_orderdtl L1
where L1.eir_order_id=2539
) L2
) L3
START WITH L3.上级分组字段加编号 LIKE '%0'
CONNECT BY PRIOR L3.分组字段加编号=L3.上级分组字段加编号
) L4
GROUP BY L4.BL_NO,L4.SAILING_DT,L4.VESSEL_CD,L4.VOYAGE,L4.CURRENCY_CD - -- ROW_NUMBER() OVER(PARTITION BY A ORDER BY B DESC) 新列名
- -- 根据A分组,在分组内部根据B排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
- -- SYS_CONNECT_BY_PATH 函数: 第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符
- -- CONNECT BY PRIOR 是标示父子关系的对应
- -- START WITH 代表你要开始遍历的的节点
-
- 第二种方案:
-
- select eir.BL_NO,eir.SAILING_DT,eir.VESSEL_CD,eir.VOYAGE,eir.CURRENCY_CD,
wm_concat(distinct eir.FEE_CD) as FEE_CD,wm_concat(distinct eir.BL_MSG) as BL_MSG
from t_eir_orderdtl eir
where eir.eir_order_id=2539
group by eir.BL_NO,eir.SAILING_DT,eir.VESSEL_CD,eir.VOYAGE,eir.CURRENCY_CD
-
=======================================================================================================
原始数据:
查询结果: