SELECT t0.FID --订单id ,t0.FBILLNO ,t2.FID 'FORECAST_ID' ,t2e.FENTRYID 'FORECASTENTRY_ID' ,t2.FBILLNO 'F_FORECASTNUMBER' ,t2e.FSEQ 'F_LINENUMBER' ,t2e.FCUSTID 'F_CUSTOMERNAME' ,t2e.FMATERIALID 'F_MATERIALCODE' --预测单物料id ,t2e.F_SOURCE_ORDER_LINE_NUMBER --销售订单行号 ,t2e.F_SOURCE_ORDER_NUMBER --销售订单单号# ,t0.F_REMARK INTO #TEMP_PLANORDER_ID_LIST FROM T_PLN_PLANORDER t0 INNER JOIN T_PLN_RESERVELINKENTRY t1e ON t1e.FINTSUPPLYID = t0.FID INNER JOIN T_PLN_RESERVELINK t1 ON t1.FID = t1e.FID INNER JOIN T_PLN_FORECASTENTRY t2e ON t2e.FENTRYID = t1.FSRCENTRYID INNER JOIN T_PLN_FORECAST t2 on t2.fid = t2e.FID WHERE 1=1 --AND t0.F_FORECASTNUMBER = '' --AND t0_b.FDEMANDTYPE = 2 AND CONVERT(nvarchar(100),t0.FCREATEDATE,23) = '2024-01-18' --GROUP BY -- t0.FID CREATE INDEX #TEMP_PLANORDER_ID_LIST_INDEX_FID ON #TEMP_PLANORDER_ID_LIST(FID); SELECT t0.FID --订单id ,t0.FBILLNO ,t0.FORECAST_ID ,t0.FORECASTENTRY_ID ,t0.F_FORECASTNUMBER ,t0.F_LINENUMBER ,t0.F_CUSTOMERNAME ,t0.F_MATERIALCODE --预测单物料id ,t0.F_SOURCE_ORDER_LINE_NUMBER --销售订单行号 ,t0.F_SOURCE_ORDER_NUMBER --销售订单单号# ,t0.F_REMARK ,t3.TOTAL INTO #TEMP_PLANORDER_RESERVELINK FROM #TEMP_PLANORDER_ID_LIST t0 INNER JOIN (SELECT FID,COUNT(1) TOTAL FROM #TEMP_PLANORDER_ID_LIST GROUP BY FID ) t3 on t3.FID = t0.FID --AND t3.total = 1 WHERE 1=1 --AND t0.F_FORECASTNUMBER = '' ALTER TABLE #TEMP_PLANORDER_RESERVELINK ADD F_DESCRIPTION varchar(255); CREATE INDEX #TEMP_PLANORDER_RESERVELINK_INDEX ON #TEMP_PLANORDER_RESERVELINK(FID); UPDATE t0 SET t0.F_FORECASTNUMBER = tt.F_FORECASTNUMBER ,t0.F_LINENUMBER = tt.F_LINENUMBER ,t0.F_CUSTOMERNAME = tt.F_CUSTOMERNAME ,t0.F_MATERIALCODE = tt.F_MATERIALCODE ,t0.F_REMARK = ISNULL(t1e_l.FDESCRIPTION,'') FROM T_PLN_PLANORDER t0 INNER JOIN #TEMP_PLANORDER_RESERVELINK tt on t0.FID = tt.FID AND tt.TOTAL = 1 LEFT JOIN T_PLN_FORECASTENTRY_L t1e_l on t1e_l.FENTRYID = tt.FORECASTENTRY_ID AND t1e_l.FLOCALEID = 2052 UPDATE t0 SET t0_l.F_DESCRIPTION = t1_l.FDESCRIPTION FROM T_PLN_PLANORDER_L t0_l INNER JOIN #TEMP_PLANORDER_RESERVELINK tt on t0.FID = tt.FID AND tt.TOTAL = 1 INNER JOIN T_PLN_FORECAST_L t1_l on tt.FORECAST_ID = t1_l.FID AND t1_l.FLOCALEID = 2052 SELECT t0.FID --订单id ,t0.FBILLNO ,t0.FORECAST_ID ,t0.FORECASTENTRY_ID ,t0.F_FORECASTNUMBER ,DENSE_RANK() over(partition BY t0.FID order by t0.FORECAST_ID) 'FORECASTNUMBER_SEQ' ,t0.F_LINENUMBER ,ROW_NUMBER() over(partition BY t0.FID,t0.FORECAST_ID order by t0.F_LINENUMBER) 'LINENUMBER_SEQ' ,t0.F_CUSTOMERNAME ,t0.F_MATERIALCODE --预测单物料id ,t0.F_SOURCE_ORDER_LINE_NUMBER --销售订单行号 ,t0.F_SOURCE_ORDER_NUMBER --销售订单单号# --,t0.F_REMARK --,ISNULL(t1_l.FDESCRIPTION,'') AS F_DESCRIPTION ,t1_l.FDESCRIPTION F_DESCRIPTION --,ISNULL(t1e_l.FDESCRIPTION,'') AS F_REMARK --表体备注 ,t1e_l.FDESCRIPTION F_REMARK ,t0.TOTAL ,DENSE_RANK() over(partition BY t0.FID order by t0.F_MATERIALCODE) 'DENSE_RANK_NUM' INTO #TEMP_PLANORDER_RESERVELINK2 FROM #TEMP_PLANORDER_RESERVELINK t0 LEFT JOIN T_PLN_FORECAST_L t1_l on t0.FORECAST_ID = t1_l.FID AND t1_l.FLOCALEID = 2052 LEFT JOIN T_PLN_FORECASTENTRY_L t1e_l on t1e_l.FENTRYID = t0.FORECASTENTRY_ID AND t1e_l.FLOCALEID = 2052 WHERE 1 = 1 AND TOTAL > 1 ORDER BY FID CREATE INDEX #TEMP_PLANORDER_RESERVELINK2_INDEX ON #TEMP_PLANORDER_RESERVELINK2(FID); UPDATE t0 SET t0.F_MATERIALCODE = 0,t0.F_CUSTOMERNAME = 0 FROM #TEMP_PLANORDER_RESERVELINK2 t0,(SELECT FID FROM #TEMP_PLANORDER_RESERVELINK2 WHERE DENSE_RANK_NUM = 2) t1 WHERE t0.FID = t1.FID SELECT t0.FID ,t0.FBILLNO ,t0.FORECAST_ID ,t0.F_FORECASTNUMBER ,t0.F_DESCRIPTION ,t0.F_MATERIALCODE ,t0.F_CUSTOMERNAME ,ISNULL(stuff((select ','+ CONVERT(nvarchar(100), tt.F_LINENUMBER) from #TEMP_PLANORDER_RESERVELINK2 tt where tt.FID=t0.FID and tt.FORECAST_ID = t0.FORECAST_ID AND tt.F_MATERIALCODE = t0.F_MATERIALCODE for xml path('')),1,1,''),'') 'F_LINENUMBER' ,ISNULL(stuff((select ';'+ tt.F_REMARK from #TEMP_PLANORDER_RESERVELINK2 tt where tt.FID=t0.FID and tt.FORECAST_ID = t0.FORECAST_ID AND tt.F_MATERIALCODE = t0.F_MATERIALCODE for xml path('')),1,1,''),'') 'F_REMARK' ,ISNULL(stuff((select distinct ','+ CONVERT(nvarchar(100), tt.F_SOURCE_ORDER_NUMBER) from #TEMP_PLANORDER_RESERVELINK2 tt where tt.FID=t0.FID and tt.FORECAST_ID = t0.FORECAST_ID for xml path('')),1,1,''),'') 'F_SOURCE_ORDER_NUMBER' ,ISNULL(stuff((select distinct ','+ CONVERT(nvarchar(100), tt.F_SOURCE_ORDER_LINE_NUMBER) from #TEMP_PLANORDER_RESERVELINK2 tt where tt.FID=t0.FID and tt.FORECAST_ID = t0.FORECAST_ID for xml path('')),1,1,''),'') 'F_SOURCE_ORDER_LINE_NUMBER' INTO #TEMP FROM #TEMP_PLANORDER_RESERVELINK2 t0 GROUP BY t0.FID ,t0.FBILLNO ,t0.FORECAST_ID ,t0.F_FORECASTNUMBER ,t0.F_DESCRIPTION ,t0.F_MATERIALCODE ,t0.F_CUSTOMERNAME CREATE INDEX #TEMP_INDEX ON #TEMP(FID); SELECT t0.FID ,t0.FBILLNO ,t0.F_MATERIALCODE ,t0.F_CUSTOMERNAME ,ISNULL(stuff((select ';'+ CONVERT(nvarchar(100), tt.F_LINENUMBER) from #TEMP tt where tt.FID=t0.FID for xml path('')),1,1,''),'') 'F_LINENUMBER' ,ISNULL(stuff((select ';'+ CONVERT(nvarchar(100), tt.F_FORECASTNUMBER) from #TEMP tt where tt.FID=t0.FID for xml path('')),1,1,''),'') 'F_FORECASTNUMBER' ,ISNULL(stuff((select ';'+ tt.F_REMARK from #TEMP tt where tt.FID=t0.FID for xml path('')),1,1,''),'') 'F_REMARK' ,ISNULL(stuff((select ';'+ tt.F_DESCRIPTION from #TEMP tt where tt.FID = t0.FID for xml path('')),1,1,''),'') 'F_DESCRIPTION' ,ISNULL(stuff((select distinct ';'+CONVERT(nvarchar(100), tt.F_SOURCE_ORDER_NUMBER) from #TEMP_PLANORDER_RESERVELINK2 tt where tt.FID=t0.FID for xml path('')),1,1,''),'') 'F_SOURCE_ORDER_NUMBER' ,ISNULL(stuff((select distinct ';'+CONVERT(nvarchar(100), tt.F_SOURCE_ORDER_LINE_NUMBER) from #TEMP_PLANORDER_RESERVELINK2 tt where tt.FID=t0.FID for xml path('')),1,1,''),'') 'F_SOURCE_ORDER_LINE_NUMBER' INTO #TEMP2 FROM #TEMP t0 --WHERE t0.fbillno ='MRP01679279' GROUP BY t0.FID ,t0.FBILLNO ,t0.F_MATERIALCODE ,t0.F_CUSTOMERNAME CREATE INDEX #TEMP2_INDEX ON #TEMP2(FID); UPDATE t0 SET t0.F_FORECASTNUMBER = tt.F_FORECASTNUMBER ,t0.F_LINENUMBER = tt.F_LINENUMBER ,t0.F_CUSTOMERNAME = tt.F_CUSTOMERNAME ,t0.F_MATERIALCODE = tt.F_MATERIALCODE ,t0.F_REMARK = ISNULL(t1e_l.FDESCRIPTION,'') FROM T_PLN_PLANORDER t0 INNER JOIN #TEMP2 tt on t0.FID = tt.FID --AND tt.TOTAL = 1 LEFT JOIN T_PLN_FORECASTENTRY_L t1e_l on t1e_l.FENTRYID = tt.FORECASTENTRY_ID AND t1e_l.FLOCALEID = 2052 UPDATE t0 SET t0_l.F_DESCRIPTION = t1_l.FDESCRIPTION FROM T_PLN_PLANORDER_L t0_l INNER JOIN #TEMP2 tt on t0.FID = tt.FID --AND tt.TOTAL = 1 INNER JOIN T_PLN_FORECAST_L t1_l on tt.FORECAST_ID = t1_l.FID AND t1_l.FLOCALEID = 2052 SELECT * FROM #TEMP2 DROP TABLE #TEMP DROP TABLE #TEMP2 DROP TABLE #TEMP_PLANORDER_ID_LIST DROP TABLE #TEMP_PLANORDER_RESERVELINK DROP TABLE #TEMP_PLANORDER_RESERVELINK2