zoukankan      html  css  js  c++  java
  • oracle多行合并一行,且需排序

    View Code
    复制代码
    SELECT lotid,
             
    ltrim(MAX(sys_connect_by_path(wf_lotno, ',')), ',') wf_lotno,
             
    ltrim(MAX(sys_connect_by_path(wf_jobno, ',')), ',') wf_jobno,
             
    ltrim(MAX(sys_connect_by_path(wf_partno, ',')), ',') wf_partno,
             
    ltrim(MAX(sys_connect_by_path(supplier, ',')), ',') supplier,
             
    ltrim(MAX(sys_connect_by_path(wf_id, ',')), ',') wf_id
      
    FROM (SELECT lotid,
                        wf_lotno,
                        wf_jobno,
                        wf_partno,
                        supplier,
                        wf_id,
                        
    MIN(wf_id) over(PARTITION BY lotid) wf_id_min,
                        (row_number() 
    over(ORDER BY lotid, wf_id)) +
                        (dense_rank() 
    over(ORDER BY lotid)) wf_id_count
                 
    FROM (SELECT lotid,
                                  wf_lotno,
                                  wf_jobno,
                                  wf_partno,
                                  supplier,
                                  to_string(
    CAST(COLLECT(wf_id) AS varchar2_ntt)) AS wf_id
                            
    FROM dio_yld_wf_inf_w
                          
    WHERE lotid = 'B737756.D1'
                          
    GROUP BY lotid,
                                      wf_lotno,
                                      wf_jobno,
                                      wf_partno,
                                      supplier))
     START 
    WITH wf_id = wf_id_min
    CONNECT 
    BY wf_id_count - 1 = PRIOR wf_id_count
     
    GROUP BY lotid;
    复制代码

    第一层:相同wf_lot先合并一次。

    比如

    lotid   wf_lot  wf_id

    10     a          5

    10     a          6

    10     b          7

    11     a          8

    11     b          9

    12     a          10

    第一层结果为

    10     a          5 / 6

    10     b          7

    11     a          8

    11     b          9

    12     a          10 

    希望达到的最终效果:

    10     a,b          5 / 6,7

    11     a,b          8,9

    12     a          10 

    注意: 10这一行不能是:

    10     a,b    7,5 / 6 

    10     b,a    5 / 6, 7 

    要按顺序排列。

    暂时看这个方法的效率不是很好。


     后面改进了一下:

    复制代码
    SELECT lotid,
             
    MAX(wf_lotno) wf_lotno,
             
    MAX(wf_jobno) wf_jobno,
             
    MAX(wf_partno) wf_partno,
             
    MAX(supplier) supplier,
             
    MAX(wf_id) wf_id
      
    FROM (SELECT t.lotid,
                        wmsys.wm_concat(t.wf_lotno) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno) wf_lotno,
                        wmsys.wm_concat(t.wf_jobno) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_jobno) wf_jobno,
                        wmsys.wm_concat(t.wf_partno) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno, t.wf_jobno) wf_partno,
                        wmsys.wm_concat(t.supplier) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno, t.supplier) supplier,
                        wmsys.wm_concat(t.wf_id) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno, t.wf_id) wf_id
                 
    FROM (SELECT lotid,
                                  wf_lotno,
                                  wf_jobno,
                                  wf_partno,
                                  supplier,
                                  to_string(
    CAST(COLLECT(wf_id) AS varchar2_ntt)) AS wf_id
                            
    FROM dio_yld_wf_inf_w
                         
    /*WHERE lotid = 'B737756.D1'*/
                          
    GROUP BY lotid,
                                      wf_lotno,
                                      wf_jobno,
                                      wf_partno,
                                      supplier) t)
     
    GROUP BY lotid;
    复制代码

    继续改进:

    复制代码
    SELECT lotid,
             
    MAX(wf_lotno) wf_lotno,
             
    MAX(wf_jobno) wf_jobno,
             
    MAX(wf_partno) wf_partno,
             
    MAX(supplier) supplier,
             
    MAX(wf_id) wf_id
      
    FROM (SELECT t.lotid,
                        wmsys.wm_concat(t.wf_lotno) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno) wf_lotno,
                        wmsys.wm_concat(t.wf_jobno) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_jobno) wf_jobno,
                        wmsys.wm_concat(t.wf_partno) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno, t.wf_jobno) wf_partno,
                        wmsys.wm_concat(t.supplier) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno, t.supplier) supplier,
                        wmsys.wm_concat(t.wf_id) 
    over(PARTITION BY t.lotid ORDER BY t.lotid, t.wf_lotno, t.wf_id) wf_id
                 
    FROM (SELECT lotid,
                                  wf_lotno,
                                  wf_jobno,
                                  wf_partno,
                                  supplier,
                                  to_string(
    CAST(COLLECT(wf_id) AS varchar2_ntt)) AS wf_id
                            
    FROM dio_yld_wf_inf_w
                         
    /*WHERE lotid = 'B737756.D1'*/
                          
    GROUP BY lotid,
                                      wf_lotno,
                                      wf_jobno,
                                      wf_partno,
                                      supplier) t)
     
    GROUP BY lotid;
    复制代码
  • 相关阅读:
    直方图内最大矩阵
    P1578 奶牛浴场
    P1569 [USACO11FEB]属牛的抗议Generic Cow Prote…
    P1566 加等式
    P1564 膜拜
    P1541 乌龟棋
    P1537 弹珠
    Response.AddHeader使用实例
    LSPCI具体解释分析
    介绍一款开源的类Excel电子表格软件
  • 原文地址:https://www.cnblogs.com/liuweicong39/p/2530601.html
Copyright © 2011-2022 走看看