【发布时间】:2018-05-21 10:38:10
【问题描述】:
在一个表中,我需要根据列将 2 条记录合并为一条记录 (在这种情况下,列 1.WORK_ORDER_NUM、2.ESN 3.PLANT 4. REMD_PART_NUM 5.REMD_PART_SERIAL)。如果这 5 列相等,那么我必须在另一列中使用 Aggregate 函数使其成为一条记录。[在 在这种情况下,列是 LLP_TRACKD_PART_IND、REMD_PART_TSN 和 REMD_PART_CSN]。
这是我尝试过的:
SELECT decode (PLANT ,'ECL','CELMA','EDS','CELMA',PLANT)PLANT,
COUNT(*) RECORD_COUNT,
COUNT(DISTINCT OFF.REMD_PART_NUM) REMD_PART_NUM_COUNT,
COUNT(DISTINCT OFF.REMD_PART_SERIAL) REMD_PART_SER_NUM_COUNT,
COUNT(DECODE(LLP_TRACKD_PART_IND,'LL',LLP_TRACKD_PART_IND,NULL)) LL_COUNT,
COUNT(DECODE(LLP_TRACKD_PART_IND,'LR',LLP_TRACKD_PART_IND,NULL)) LR_COUNT,
COUNT(DECODE(LLP_TRACKD_PART_IND,'TR',LLP_TRACKD_PART_IND,NULL)) TR_COUNT,
SUM(OFF.REMD_PART_QTY) TOTAL_REMD_PART_QTY,
SUM(decode(LLP_TRACKD_PART_IND,null,0,
CASE
WHEN REGEXP_LIKE(REMD_PART_TSN, '^-?\d+(\.\d+)?$')
THEN CAST(REMD_PART_TSN AS NUMBER)
ELSE 0
END
)) TOTAL_TSN,
SUM(decode(LLP_TRACKD_PART_IND,null,0,
CASE
WHEN REGEXP_LIKE(REMD_PART_CSN, '^-?\d+(\.\d+)?$')
THEN CAST(REMD_PART_CSN AS NUMBER)
ELSE 0
END
)) TOTAL_CSN
FROM (with t as ( SELECT distinct PLANT,
WORK_ORDER_NUM,ESN,REMD_PART_NUM,REMD_PART_SERIAL,REMD_PART_IIN,
LLP_TRACKD_PART_IND,
REMD_PART_QTY,REMD_PART_TSN,REMD_PART_CSN,REMD_PART_TSO,REMD_PART_CSO
,REMD_PART_TSC,REMD_PART_CSC,REMD_CYCLE_REMAIN
FROM <TABLE1>
WHERE
REMD_PART_NUM is not null
)
select DISTINCT PLANT,WORK_ORDER_NUM,ESN,REMD_PART_NUM,REMD_PART_SERIAL
,REMD_PART_IIN
,(select max(LLP_TRACKD_PART_IND) from t bb where aa.PLANT=bb.PLANT and
aa.WORK_ORDER_NUM=bb.WORK_ORDER_NUM
and aa.ESN=bb.ESN
and aa.REMD_PART_NUM=bb.REMD_PART_NUM
and aa.REMD_PART_SERIAL=bb.REMD_PART_SERIAL) LLP_TRACKD_PART_IND
,REMD_PART_QTY
,(select max(REMD_PART_TSN) from t bb where aa.PLANT=bb.PLANT and
aa.WORK_ORDER_NUM=bb.WORK_ORDER_NUM
and aa.ESN=bb.ESN
and aa.REMD_PART_NUM=bb.REMD_PART_NUM
and aa.REMD_PART_SERIAL=bb.REMD_PART_SERIAL) REMD_PART_TSN
,
(select max(REMD_PART_CSN) from t bb where aa.PLANT=bb.PLANT and
aa.WORK_ORDER_NUM=bb.WORK_ORDER_NUM
and aa.ESN=bb.ESN
and aa.REMD_PART_NUM=bb.REMD_PART_NUM
and aa.REMD_PART_SERIAL=bb.REMD_PART_SERIAL) REMD_PART_CSN
from t aa) OFF
WHERE
REMD_PART_NUM is not null
GROUP BY decode (PLANT ,'ECL','CELMA','EDS','CELMA',PLANT)
大约需要 8 小时才能完成。有没有其他方法可以更快地完成它。 It took 8 hours to complete
【问题讨论】:
-
微调?您使用的是 MySQL 还是 Oracle? (不要标记未涉及的产品。)
-
@jarlh 这是甲骨文。
-
它是甲骨文。 @jarlh
-
查看执行计划以确定 oracle 将所有时间用于解决问题的地方。 ps;就查询而言,它看起来很糟糕——在 select 和 from 之间有嵌套子查询的查询总是为我敲响警钟。我认为您最好不要要求我们修复您编写的查询,而是向我们提供示例输入和输出并寻求帮助以另一种方式编写新查询来解决问题
标签: sql oracle with-statement sql-tuning