DECLARE @period int declare @dbName varchar(100) SET @period = 201801 select @dbName = DB_NAME() if @dbName != 'AIS20231110222743' BEGIN SET @period = 202406 END IF EXISTS (SELECT 1 WHERE OBJECT_ID('tempdb..#生产订单') IS NOT NULL) BEGIN DROP TABLE #生产订单 END IF EXISTS (SELECT 1 WHERE OBJECT_ID('tempdb..#数据整合') IS NOT NULL) BEGIN DROP TABLE #数据整合 END CREATE TABLE #数据整合 ( MOBILLNO NVARCHAR(255) NOT NULL ,PMOBILLNO NVARCHAR(255) NOT NULL ,直接材料 DECIMAL(23,10) NOT NULL ,FPRODUCTDIMEID INT NOT NULL ,ALEVEL INT NOT NULL ,PLEVEL INT NOT NULL ,BILLID INT NOT NULL ,BILLENTRYID INT NOT NULL ,FPRODUCTID INT NOT NULL ,FMATERIALID INT NOT NULL ,LOT_TEXT VARCHAR(255) NULL ,FPERIOD INT NOT NULL ,APATH VARCHAR(1000) NULL ,PPATH VARCHAR(1000) NULL ,MPATH VARCHAR(8000) NULL ) INSERT INTO #数据整合 SELECT t0.FBILLNO ,'' ,0 ,t1.FPRODUCTDIMEID ,1 ,0 ,t1.FBILLID ,t1.FBILLENTRYID ,t1.FPRODUCTID ,t0e.FMATERIALID ,t0.FBILLNO ,t5.FPERIOD ,CONVERT(varchar(1000),ROW_NUMBER() OVER (ORDER BY t0e.FID,t0e.FENTRYID,t0e.FMATERIALID)) AS 'aPATH' ,CONVERT(varchar(1000),'0') AS 'PPATH' ,CONVERT(VARCHAR(8000),'') AS 'MPath' FROM T_PRD_MO t0 INNER JOIN T_PRD_MOENTRY t0e on t0.FID = t0e.FID INNER jOIN T_CB_PROORDERDIME t1 on t1.FBILLID = t0e.FID AND t1.FBILLENTRYID = t0e.FENTRYID INNER JOIN V_CB_PROORDERINFO t2 on t2.FPRODUCTDIMEID = t1.FPRODUCTDIMEID CROSS APPLY( SELECT TOP 1 1 AS 'val',t5.FYEAR *100 + t5.FPERIOD AS 'FPERIOD' FROM V_HS_OUTACCTG t5 WHERE t5.FID = t2.FACCTGID AND t5.FYEAR *100 + t5.FPERIOD <= @period ORDER BY t5.FYEAR *100 + t5.FPERIOD DESC ) t5 WHERE 1 = 1 --AND t0.FBILLNO = 'WO2403210039' AND t1.FFORMID = 'PRD_MO' --AND (CONVERT(INT,CONVERT(varchar(6),t0.FDATE,112))) = @period DECLARE @num INT,@level int,@LoopCount int SET @num = 1 SET @level =1 SET @LoopCount = 0; WHILE (@num <> 0 AND @LoopCount < 30) BEGIN ;WITH #查询数据 AS ( SELECT t0.FPRODUCTNO ,t0.FPRODUCTID ,t0.FBILLID ,t0.FBILLENTRYID ,SUM(t1.FAMOUNT) AS '领料成本' ,SUM(t1.FQTY) AS '领料数量' ,t2.FMATERIALID ,ISNULL(t4.FNUMBER,'') 'FLOT_TEXT' ,SUM(t1m.FQUALIFIEDINAMOUNT) '本期完工金额' ,SUM(t1m.FQUALIFIEDINQTY) '本期完工数量' ,t5.FPERIOD FROM T_CB_PROORDERDIME t0 INNER JOIN V_CB_PROORDERINFO t0e on t0e.FPRODUCTDIMEID = t0.FPRODUCTDIMEID INNER JOIN V_CB_COSTALLORESULTSEND t1 on t0.FPRODUCTDIMEID = t1.FPRODUCTDIMEID INNER JOIN V_CB_COSTMATTERIAL t1m on t1m.FID = t0e.FID INNER JOIN T_HS_INIVSTOCKDIMENSION t2 on t2.FENTRYID = t1.FDIMEENTRYID AND t1m.FMATERIALID = t2.FMATERIALID INNER JOIN V_HS_OUTINSTOCKSEQ t3 on t3.FENTRYID = t1.FOUTINSTOCKID LEFT JOIN T_BD_LOTMASTER t4 on t4.FLOTID = t2.FLOT CROSS APPLY( SELECT TOP 1 1 AS 'val',(t5.FYEAR * 100 + t5.FPERIOD) AS 'FPERIOD' FROM V_HS_OUTACCTG t5 WHERE t5.FID = t0e.FACCTGID AND t5.FYEAR *100 + t5.FPERIOD <= 202407 ORDER BY t5.FYEAR *100 + t5.FPERIOD DESC ) t5 WHERE t0.FPRODUCTNO IN ( SELECT DISTINCT tt.LOT_TEXT FROM #数据整合 tt WHERE 1=1 AND tt.ALEVEL = @level AND tt.LOT_TEXT != '') GROUP BY t0.FPRODUCTNO ,t0.FPRODUCTID ,t0.FBILLID ,t0.FBILLENTRYID ,t2.FMATERIALID ,t4.FNUMBER ,t5.FPERIOD ) INSERT INTO #数据整合 SELECT t0.FPRODUCTNO ,t1.MOBILLNO ,CONVERT(decimal(23,10),t0.本期完工金额) ,t1.FPRODUCTDIMEID ,@level ,@level - 1 ,t0.FBILLID ,t0.FBILLENTRYID ,t0.FPRODUCTID ,t0.FMATERIALID ,t0.FLOT_TEXT ,t0.FPERIOD ,CONVERT(varchar(1000),CONCAT(t1.APATH,'.',ROW_NUMBER() OVER (PARTITION BY t0.FBILLID,t0.FBILLENTRYID ORDER BY t0.FMATERIALID))) AS 'aPATH' ,t1.APATH ,CONVERT(varchar(8000),CONCAT(t1.MPath,ISNULL(t1.MoBillNo,''),'>')) FROM #查询数据 t0 INNER JOIN #数据整合 t1 on t0.FPRODUCTNO = t1.LOT_TEXT AND t1.LOT_TEXT != '' SET @num = @@ROWCOUNT SET @level += 1 SET @LoopCount += 1 END SELECT * FROM #数据整合