;WITH #物料属性 AS ( SELECT t0e.FENUMID,t0e.FSEQ,t0e.FVALUE,t0e_l.FCAPTION FROM T_META_FORMENUMITEM t0e INNER JOIN T_META_FORMENUMITEM_L t0e_l on t0e.FENUMID = t0e_l.FENUMID AND t0e_l.FLOCALEID = 2052 WHERE 1 = 1 AND t0e.FID = 'ac14913e-bd72-416d-a50b-2c7432bbff63' ) ,#BOM展开 AS ( SELECT TOP 1 t0.FID,t0.FMATERIALID,t0.FNUMBER,t0.FUNITID ,0 lv ,ROW_NUMBER() OVER (PARTITION BY t0.FMATERIALID ORDER BY t0.FNUMBER DESC) RN ,CAST('1' AS nvarchar(100)) MPath ,CAST('' AS nvarchar(100)) PBomNumber ,CAST(1 AS decimal(23,10)) 标准用量 --,0 RN FROM T_ENG_BOM t0 INNER JOIN T_BD_MATERIAL t1 on t1.FMATERIALID = t0.FMATERIALID WHERE 1 = 1 --AND t0.FMATERIALID = 9554131 AND t1.FNUMBER = '97.03.0097' AND t0.FDOCUMENTSTATUS = 'C' AND t0.FFORBIDSTATUS = 'A' AND t0.FUSEORGID = 1 ORDER BY t0.FNUMBER DESC UNION ALL SELECT ISNULL(t1.FID,0),t0e.FMATERIALID,ISNULL(t1.FNUMBER, ''),t0e.FUNITID,1 + t0.lv ,ROW_NUMBER() OVER (ORDER BY t0.RN DESC,t0e.FSEQ) ,CAST(CONCAT(t0.MPath,'.',ROW_NUMBER() OVER (ORDER BY t0.RN DESC,t0e.FSEQ)) AS nvarchar(100)) ,CAST(t0.FNUMBER AS nvarchar(100)) ,CAST(t0e.FNUMERATOR /t0e.FDENOMINATOR * t0.标准用量 AS decimal(23,10)) FROM #BOM展开 t0 INNER JOIN T_ENG_BOMCHILD t0e on t0e.FID = t0.FID AND t0e.FMATERIALTYPE != 3 OUTER APPLY ( SELECT t1.FID,t1.FMASTERID,t1.FMATERIALID,t1.FNUMBER,t1.FUNITID ,ROW_NUMBER() OVER (PARTITION BY t1.FMATERIALID ORDER BY t1.FNUMBER DESC) RN FROM T_ENG_BOM t1 WHERE t1.FMATERIALID = t0e.FMATERIALID AND t1.FDOCUMENTSTATUS = 'C' AND t1.FFORBIDSTATUS = 'A' AND t1.FUSEORGID = 1 ) t1 WHERE (t1.RN = 1 OR t1.RN IS NULL) AND t0.FNUMBER != '' --AND t0.lv < 2 ) SELECT t0.RN,t0.MPath,t1.FNUMBER '物料编码',t1_l.FNAME '物料名称',t1_l.FSPECIFICATION '规格型号',t2.FCAPTION '物料属性','' '供应类型',t0.FNUMBER 'BOM版本' ,t3_l.FNAME '单位',t0.标准用量,CAST('' AS nvarchar(4)) '专用料标识','' 'L/T' ,0 库存数量,0 预计入库数,0 未推PR数,0 已分配量,0 计划分配量,'' 计划员,'' 采购员 ,t0.FMATERIALID,t0.lv INTO #BOM FROM #BOM展开 t0 INNER JOIN T_BD_MATERIAL t1 on t1.FMATERIALID = t0.FMATERIALID INNER JOIN T_BD_MATERIAL_L t1_l on t1_l.FMATERIALID = t1.FMATERIALID AND t1_l.FLOCALEID = 2052 INNER JOIN T_BD_MATERIALBASE t1b on t1b.FMATERIALID = t1.FMATERIALID INNER JOIN T_BD_MATERIALPLAN t1p on t1p.FMATERIALID = t1.FMATERIALID INNER JOIN #物料属性 t2 on t2.FVALUE = t1b.FERPCLSID INNER JOIN T_BD_UNIT_L t3_l on t3_l.FUNITID = t0.FUNITID AND t3_l.FLOCALEID = 2052 WHERE 1 = 1 --AND t0.lv < 2 ORDER BY CAST(CONCAT('/',REPLACE(t0.MPath,'.','/'),'/') AS HIERARCHYID) --SELECT * --FROM #BOM t0 ;WITH #物料反查 AS ( SELECT t0.FMATERIALID,t1.FMATERIALGROUP,t0e.FMATERIALID 'srcMaterialId'--,t0e.FID,t0.FNUMBER ,0 lv,CAST(CONCAT(t0.FMATERIALID,'_',t0e.FMATERIALID,'_') AS nvarchar(2000)) aPath FROM ( SELECT tt.FMATERIALID FROM #BOM tt WHERE 1=1 AND tt.lv > 0 GROUP BY tt.FMATERIALID ) tt INNER JOIN T_ENG_BOMCHILD t0e on t0e.FMATERIALID = tt.FMATERIALID INNER JOIN T_ENG_BOM t0 on t0.FID = t0e.FID INNER JOIN T_BD_MATERIAL t1 on t1.FMATERIALID = t0.FMATERIALID WHERE 1=1 GROUP BY t0.FMATERIALID,t1.FMATERIALGROUP,t0e.FMATERIALID UNION ALL SELECT t1.FMATERIALID,t1.FMATERIALGROUP,tt.srcMaterialId--,t0e.FID,t0.FNUMBER ,tt.lv + 1,CAST(CONCAT(t1.FMATERIALID,'_',tt.aPath) AS nvarchar(2000)) FROM #物料反查 tt CROSS APPLY ( SELECT t0.FMATERIALID,t1.FMATERIALGROUP,t0e.FMATERIALID 'srcMaterialId' ,ROW_NUMBER() OVER (PARTITION BY t0.FMATERIALID ORDER BY t0.FNUMBER DESC) RN FROM T_ENG_BOMCHILD t0e INNER JOIN T_ENG_BOM t0 on t0.FID = t0e.FID INNER JOIN T_BD_MATERIAL t1 on t1.FMATERIALID = t0.FMATERIALID WHERE 1 = 1 AND tt.FMATERIALID = t0e.FMATERIALID ) t1 WHERE t1.RN = 1 ) SELECT * FROM #物料反查 t0 INNER JOIN T_BD_MATERIALGROUPLEVEL t1 on t0.FMATERIALGROUP = t1.FID INNER JOIN T_BD_MATERIALGROUP t2 on t2.FID = t1.FGROUP1 WHERE t2.FNUMBER = '1' ORDER BY lv desc,srcMaterialId DESC DROP TABLE #BOM