我试图简单地做的是从BOM表中的项目(物料清单)得到它的相关部件/产品BOMVERSION,然后对这些相关的组件/产品得到他们的相关部件和产品等下降到7级。 那么我想转动的结果,使相关项目投入列获得0, 1, 2, 3, 4, 5, 6, 7
请参阅案例数据和代码。 我使用的是动态AX 2012 R2,但这个例子可以应用到使用的材料/产品的任何系统。 我不能让我的却查询完成(我知道我没有dataareaid和分区我已经离开了为简单起见)。 的关系是从BOM表中的itemid通过BOMID在BOMVERSION到为itemid相关。
更新:我已经简化数据等方面做出简单/清晰越好,这样的材料木材,金属,玻璃可以进入制作各种产品和材料本身,并且可以结合起来,使产品或材料。 因此,我想用一个基本组件开始,然后通过水平爆炸的关系了。
DDL + DML:
USE tempdb;
IF OBJECT_ID('tempdb..#BOM') IS NOT NULL
DROP TABLE #BOM;
CREATE TABLE #BOM
(
ITEMID NVARCHAR(10) ,
BOMID NVARCHAR(10) ,
MATERIALNAME NVARCHAR(10)
);
INSERT INTO #BOM
VALUES ( N'113621', -- ITEMID - nvarchar(10)
N'1', -- BOMID - nvarchar(10)
N'Wood' -- MATERIALNAME - nvarchar(10)
);
INSERT INTO #BOM
VALUES ( N'234517', -- ITEMID - nvarchar(10)
N'2', -- BOMID - nvarchar(10)
N'Metal' -- MATERIALNAME - nvarchar(10)
);
INSERT INTO #BOM
VALUES ( N'378654', -- ITEMID - nvarchar(10)
N'3', -- BOMID - nvarchar(10)
N'Glass' -- MATERIALNAME - nvarchar(10)
);
IF OBJECT_ID('tempdb..#BOMVERSION') IS NOT NULL
DROP TABLE #BOMVERSION;
CREATE TABLE #BOMVERSION
(
ITEMID NVARCHAR(10) ,
BOMID NVARCHAR(10) ,
NAME NVARCHAR(20)
);
INSERT INTO #BOMVERSION
VALUES ( N'113477', -- ITEMID - nvarchar(10)
N'1', -- BOMID - nvarchar(10)
N'Oak' -- NAME - nvarchar(10)
);
INSERT INTO #BOMVERSION
VALUES ( N'113608', -- ITEMID - nvarchar(10)
N'1', -- BOMID - nvarchar(10)
N'Pine' -- NAME - nvarchar(10)
);
INSERT INTO #BOMVERSION
VALUES ( N'113622', -- ITEMID - nvarchar(10)
N'1', -- BOMID - nvarchar(10)
N'Wood Table' -- NAME - nvarchar(10)
);
INSERT INTO #BOMVERSION
VALUES ( N'113683', -- ITEMID - nvarchar(10)
N'2', -- BOMID - nvarchar(10)
N'Aluminium' -- NAME - nvarchar(10)
);
INSERT INTO #BOMVERSION
VALUES ( N'113689', -- ITEMID - nvarchar(10)
N'2', -- BOMID - nvarchar(10)
N'Steel' -- NAME - nvarchar(10)
);
INSERT INTO #BOMVERSION
VALUES ( N'113693', -- ITEMID - nvarchar(10)
N'2', -- BOMID - nvarchar(10)
N'Metal table' -- NAME - nvarchar(10)
);
INSERT INTO #BOMVERSION
VALUES ( N'113694', -- ITEMID - nvarchar(10)
N'3', -- BOMID - nvarchar(10)
N'Glass' -- NAME - nvarchar(10)
);
INSERT INTO #BOMVERSION
VALUES ( N'113695', -- ITEMID - nvarchar(10)
N'3', -- BOMID - nvarchar(10)
N'Glass BookCase' -- NAME - nvarchar(10)
);
--Query
WITH BOM1
AS ( SELECT B.ITEMID AS BITEMID ,
BV.ITEMID AS BVITEMID ,
B.MATERIALNAME ,
B.BOMID
FROM #BOM AS B
JOIN #BOMVERSION AS BV ON BV.BOMID = B.BOMID
),
EXPLODE
AS ( SELECT B.BITEMID ,
B.MATERIALNAME ,
B.BVITEMID ,
B.BOMID ,
0 AS [Level]
FROM BOM1 AS B
UNION ALL
SELECT B.BITEMID ,
E.MATERIALNAME ,
E.BVITEMID ,
E.BOMID ,
[E].[Level] + 1
FROM EXPLODE AS E
JOIN BOM1 AS B ON B.BOMID = E.BOMID
WHERE E.Level <= 6 --narrowing levels
)
SELECT *
FROM EXPLODE PIVOT ( MAX(BVITEMID) FOR Level IN ( [0], [1], [2], [3],
[4], [5], [6], [7] ) ) AS PVTBOM;
输出看起来像