declare @sqlL varchar(max) declare @billNo varchar(100),@materialNumber varchar(100) declare @dbName varchar(100) 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 [dbo].[#关联项目费用临时表] END CREATE TABLE #生产订单( [FBILLNO] [nvarchar] (255) NOT NULL, [FID] [int] NOT NULL, [FENTRYID] [int] NOT NULL, [TopMaterialId] [int] NULL, [FMATERIALID] [int] NULL, [FFORMID] [varchar](36) NULL, [入库数量] [decimal](23, 10) NOT NULL, [FSTATUS] [char](1) NULL, [FCOSTDATE] [datetime] NULL, [FQTY] [decimal](23, 10) NOT NULL, [FPERIOD] [int] NULL ) ON [PRIMARY] SET @sqlL = N' INSERT INTO #生产订单 SELECT t0.FBILLNO,t0.FID,t0e.FENTRYID,t0e.FMATERIALID AS TopMaterialId,t0e.FMATERIALID ,t0.FFORMID AS FFORMID,t0e_a.FSTOCKINQUASELAUXQTY AS 入库数量 ,t0e_a.FSTATUS,t0e_a.FCOSTDATE,t0e_a.FSTOCKINQUASELAUXQTY AS FQTY ,CONVERT(INT, CONVERT(VARCHAR(6),ISNULL(t0e_a.FCOSTDATE,GETDATE()),112)) AS FPERIOD FROM T_PRD_MO t0 INNER JOIN T_PRD_MOENTRY t0e on t0.FID = t0e.FID INNER JOIN T_PRD_MOENTRY_A t0e_a on t0e.FENTRYID = t0e_a.FENTRYID INNER JOIN T_BD_MATERIAL t1 on t1.FMATERIALID = t0e.FMATERIALID WHERE 1 = 1 ' select @dbName = db_name() if @dbName != 'AIS20231110222743' BEGIN SET @billNo = 'WO2403210039' END IF @billNo != '' OR @materialNumber = '' BEGIN SET @sqlL = @sqlL + N' AND t0.FBILLNO = ''' + @billNo + '''' END IF @materialNumber != '' BEGIN SET @sqlL = @sqlL + N' AND t1.FNUMBER = ''' + @materialNumber + '''' END EXEC(@sqlL) ;WITH #批号 AS ( SELECT t0.FLOTID,ISNULL(t1.FID,0) 'LotMoId' ,ISNULL(t1e.FENTRYID,0) 'LotMoEntryId' FROM T_BD_LOTMASTER t0 LEFT JOIN T_PRD_MO t1 on t0.FNUMBER = t1.FBILLNO LEFT JOIN T_PRD_MOENTRY t1e on t1e.FID = t1.FID WHERE t0.FDOCUMENTSTATUS = 'C' AND t0.FFORBIDSTATUS = 'A' ) --, #直接材料 AS ( -- SELECT t2.FMATERIALID -- ,t1.FPRODUCTDIMEID,t2.FLOT -- ,SUM(t1.FAMOUNT) 'FAMOUNT' -- ,MAX(CONVERT(int,CONVERT(varchar(6) ,t3.FBILLDATE,112))) AS 'FPERIOD' -- FROM V_CB_COSTALLORESULTSEND t1 -- INNER JOIN T_HS_INIVSTOCKDIMENSION t2 on t1.FDIMEENTRYID = t2.FENTRYID -- INNER JOIN V_HS_OUTINSTOCKSEQ t3 on t3.FENTRYID = t1.FOUTINSTOCKID -- OUTER APPLY ( -- SELECT t4.FNUMBER,t7.FPRODUCTNO -- ,ISNULL(t7.FBILLID,0),ISNULL(t7.FBILLENTRYID,0) -- FROM T_BD_LOTMASTER t4 -- LEFT JOIN T_CB_PROORDERDIME t7 on t7.FPRODUCTNO = t4.FNUMBER -- WHERE t4.FLOTID = t0.FLOT -- ) t4 -- GROUP BY t2.FMATERIALID,t1.FPRODUCTDIMEID,t2.FLOT --) ,#数据整合 AS ( SELECT t0.FBILLNO AS 'MoBillNo' ,t0.FBILLNO AS 'PMoBillNo' ,CONVERT(varchar(1000),ROW_NUMBER() OVER (ORDER BY t0.FID,t0.FENTRYID,t0.FMATERIALID)) AS 'aPATH' ,CONVERT(varchar(1000),'0') AS 'PPATH' ,CONVERT(VARCHAR(8000),'') AS 'MPath' ,0 AS 'lv' ,t0.FID AS 'MoId' ,t0.FENTRYID AS 'MoEntryId' ,t0.FMATERIALID AS 'MoMaterialId' ,0 AS 'PMoId' ,0 AS 'PMoEntryId' ,0 AS 'PMoMaterialId' ,t0.TopMaterialId ,t0.FMATERIALID ,0 Lot --,CONVERT(nvarchar(255),t0.FBILLNO) AS 'Lot' ,CONVERT(decimal(23,10),0) AS 'FAMOUNT' ,t0.FPERIOD FROM #生产订单 t0 INNER JOIN T_CB_PROORDERDIME tt on t0.FID = tt.FBILLID AND t0.FENTRYID = tt.FBILLENTRYID INNER JOIN V_CB_COSTALLORESULTSEND t1 on tt.FPRODUCTDIMEID = t1.FPRODUCTDIMEID INNER JOIN T_HS_INIVSTOCKDIMENSION t2 on t2.FENTRYID = t1.FDIMEENTRYID INNER JOIN V_HS_OUTINSTOCKSEQ t3 on t3.FENTRYID = t1.FOUTINSTOCKID UNION ALL SELECT ISNULL(t1.FPRODUCTNO,'') AS 'MoBillNo' ,tt.MoBillNo ,CONVERT(varchar(1000),CONCAT(tt.aPATH,'.',ROW_NUMBER() OVER (PARTITION BY tt.MoId,tt.MoEntryId ORDER BY t1.FMATERIALID))) AS 'aPATH' ,tt.aPATH ,CONVERT(varchar(8000),CONCAT(tt.MPath,ISNULL(tt.MoBillNo,''),'>')) ,tt.lv + 1 lv ,ISNULL(t1.FBILLID,0) AS 'MoId' ,ISNULL(t1.FBILLENTRYID,0) AS 'MoEntryId' ,ISNULL(t1.FMATERIALID, 0) ,tt.MoId AS 'PMoId' ,tt.MoEntryId AS 'PMoEntryId' ,tt.MoMaterialId AS 'PMoMaterialId' ,tt.TopMaterialId ,t1.FMATERIALID ,ISNULL(t1.FLOT,0) ,CONVERT(decimal(23,10),t1.FAMOUNT) ,t1.FPERIOD FROM (SELECT t0.*,t1.FNUMBER FROM #数据整合 t0 INNER JOIN T_BD_LOTMASTER t1 on t0.Lot != 0 AND t0.Lot = t1.FLOTID ) tt CROSS APPLY ( SELECT t0.FBILLID,t0.FBILLENTRYID ,t0.FPRODUCTNO ,t1.FAMOUNT,t2.FMATERIALID,t2.FLOT ,CONVERT(int,CONVERT(varchar(6) ,t3.FBILLDATE,112)) AS 'FPERIOD' FROM T_CB_PROORDERDIME t0 INNER JOIN V_CB_COSTALLORESULTSEND t1 on t0.FPRODUCTDIMEID = t1.FPRODUCTDIMEID INNER JOIN T_HS_INIVSTOCKDIMENSION t2 on t2.FENTRYID = t1.FDIMEENTRYID INNER JOIN V_HS_OUTINSTOCKSEQ t3 on t3.FENTRYID = t1.FOUTINSTOCKID --WHERE tt.FID = t0.FBILLID AND tt.FENTRYID = t0.FBILLENTRYID WHERE tt.FNUMBER = t0.FPRODUCTNO --GROUP BY t2.FMATERIALID,t4.FNUMBER,t5.FID,t5e.FENTRYID ) t1 ) , #成本计算 AS ( SELECT t0.FPRODUCTDIMEID ,t0.FPRODUCTNO ,t2.FMATERIALID ,SUM(t2.FQUALIFIEDINQTY) '本期完工入库数量' ,SUM(t2e.FQUALIFIEDINAMOUNT) AS '本期完工入库金额' ,SUM(t2.FCURRINPUTAMOUNT) AS '本期投入金额' FROM T_CB_PROORDERDIME t0 INNER JOIN V_CB_PROORDERINFO t1 ON t1.FPRODUCTDIMEID= t0.FPRODUCTDIMEID INNER JOIN V_CB_COSTMATTERIAL t2 on t2.FID = t1.FID INNER JOIN V_CB_COSTMATTERIALDETAIL t2e on t2.FENTRYID = t2e.FENTRYID WHERE 1 = 1 AND t2.FEXPTYPE = 0 --AND t0.FPRODUCTNO = 'WO2403210039' AND t2e.FEXPENSESITEMID = 20045 AND t2e.FCOSTITEMID = 20522 GROUP BY t0.FPRODUCTDIMEID ,t2.FMATERIALID ,t0.FPRODUCTNO )SELECT * FROM #数据整合 --SELECT -- * -- ,t1.总成本 / t0.本期投入金额 * t0.本期完工入库金额 AS '完工金额' --FROM #成本计算 t0 -- INNER JOIN #材料费用分配明细 t1 on t0.FPRODUCTDIMEID = t1.FPRODUCTDIMEID -- AND t0.FMATERIALID = t1.FMATERIALID