博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle多行合并一行,且需排序
阅读量:7113 次
发布时间:2019-06-28

本文共 3069 字,大约阅读时间需要 10 分钟。

 

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;

 

转载于:https://www.cnblogs.com/liuweicong39/archive/2012/06/01/2530601.html

你可能感兴趣的文章
Input Method of Win32 System
查看>>
count(*) VS count(X)
查看>>
MS ASP.Net Ajax 服务端扩展
查看>>
android102 查询,插入联系人
查看>>
数据库邮件
查看>>
adstrtal.sh报超时错误 ERROR : Timed out( 100000 ): Interrupted Exception
查看>>
一个前端工程师的基本修养
查看>>
ZT:三十个好习惯
查看>>
.Net开发笔记(七)使用组件编程
查看>>
ASP.NET企业开发框架IsLine FrameWork系列之八--AppLogProvider日志框架(下)
查看>>
DataBase异常状态:Recovery Pending,Suspect,估计Recovery的剩余时间
查看>>
一个android版本的rss阅读器--明天补充实现过程,先上图
查看>>
WPF TreeView
查看>>
HTML: 仿写一个财经类静态的网页
查看>>
POJ 3979 分数减法【数学问题的探讨】
查看>>
HashSet
查看>>
C#读写config配置文件
查看>>
JavaScript:文本域事件处理
查看>>
关于dctser进程
查看>>
Sqoop架构(四)
查看>>