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;
    复制代码
  • 相关阅读:
    LOJ #2196「SDOI2014」LIS
    LOJ#2249 Luogu P2305「NOI2014」购票
    LOJ #6268 分拆数
    Luogu P3700「CQOI2017」小Q的表格
    LOJ #2527 Luogu P4491「HAOI2018」染色
    knockout 学习使用笔记-----event绑定传参ko属性
    bootstrap select 学习使用笔记-------选中赋值及change监听丢失
    knockout 学习使用笔记------绑定值时赋值失败
    js 数组判断是否包含某元素 或 数组去重
    bootstrap-select 使用笔记 设置选中值及手动刷新
  • 原文地址:https://www.cnblogs.com/liuweicong39/p/2530601.html
Copyright © 2011-2022 走看看