ORACLE 用SQL同一列的多行记录拼接成一个字符串


  1. -- 原始数据  
  2. -- a   111  
  3. -- b   222  
  4. -- a   333  
  5. -- a   444  
  6. -- b   555  
  7. -- 最终结果  
  8. -- a   111*333*444  

  9. 第一种方案:

  10. 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
  11. -- ROW_NUMBER() OVER(PARTITION BY A ORDER BY B DESC) 新列名  
  12. -- 根据A分组,在分组内部根据B排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)    
  13. -- SYS_CONNECT_BY_PATH 函数: 第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符  
  14. -- CONNECT BY PRIOR 是标示父子关系的对应  
  15. -- START WITH 代表你要开始遍历的的节点  

  16. 第二种方案:

  17. 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

=======================================================================================================
原始数据:


查询结果:


你可能感兴趣的:(SQL)