oracle多行合并一行且排序

ExpandedBlockStart.gifView 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;

转载于:https://www.cnblogs.com/oldcat/archive/2011/09/17/2179812.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值