Sql server 计算物料清单数量的CTE
有鉴于此,我正试图找出文件ID为140129的项目的正确数量。查询返回18,但总数应为24,因为FileID 140111的父数量为2。我试过在不同的地方让父母和孩子相乘,但我有一个心理障碍。有什么建议吗Sql server 计算物料清单数量的CTE,sql-server,common-table-expression,Sql Server,Common Table Expression,有鉴于此,我正试图找出文件ID为140129的项目的正确数量。查询返回18,但总数应为24,因为FileID 140111的父数量为2。我试过在不同的地方让父母和孩子相乘,但我有一个心理障碍。有什么建议吗 您需要将Count字段与其直接的parentID值相乘。我们可以从第一级开始,保存当前值和对父级的引用,并将其递归到顶部,如下所示: ;WITH Data AS ( SELECT * FROM ( VALUES (01,
您需要将
Count
字段与其直接的parentID值相乘。我们可以从第一级开始,保存当前值和对父级的引用,并将其递归到顶部,如下所示:
;WITH Data AS
( SELECT *
FROM (
VALUES (01, 'DemoParent', 0, 139209, 1),
(02, '78200', 139209, 140072, 1),
(03, '78180', 139209, 140087, 1),
(04, '78160', 139209, 140117, 1),
(05, '78140', 139209, 140145, 1),
(06, '78148', 140066, 140129, 6),
(07, '78203', 140068, 140066, 1),
(08, '78202', 140072, 140068, 1),
(09, '78148', 140081, 140129, 3),
(10, '78183', 140083, 140081, 1),
(11, '78182', 140087, 140083, 1),
(12, '78148', 140111, 140129, 6),
(13, '78163', 140113, 140111, 2),
(14, '78162', 140117, 140113, 2),
(15, '78148', 140139, 140129, 3),
(16, '78143', 140145, 140139, 1)
) Data([ID], [PartName], [ParentID], [FileID], [RefCount])
), BomQty AS
( SELECT [ID], [FileId] AS [Current], [RefCount] AS [Total], 1 As Level
FROM Data
WHERE ParentID = 0
UNION ALL
SELECT Data.[ID], Data.[FileId],
Data.[RefCount] * BomQty.[Total], BomQty.Level + 1
FROM BomQty -- Magic happens here
JOIN Data
ON Data.[ParentID] = BomQty.[Current]
)
SELECT [Current], SUM(Total) Quantity
FROM BomQty
GROUP
BY [Current]
我是这样读你的数据的:
;WITH Data AS
( SELECT *
FROM (
VALUES (01, 'DemoParent', 0, 139209, 1),
(02, '78200', 139209, 140072, 1),
(03, '78180', 139209, 140087, 1),
(04, '78160', 139209, 140117, 1),
(05, '78140', 139209, 140145, 1),
(06, '78148', 140066, 140129, 6),
(07, '78203', 140068, 140066, 1),
(08, '78202', 140072, 140068, 1),
(09, '78148', 140081, 140129, 3),
(10, '78183', 140083, 140081, 1),
(11, '78182', 140087, 140083, 1),
(12, '78148', 140111, 140129, 6),
(13, '78163', 140113, 140111, 2),
(14, '78162', 140117, 140113, 2),
(15, '78148', 140139, 140129, 3),
(16, '78143', 140145, 140139, 1)
) Data([ID], [PartName], [ParentID], [FileID], [RefCount])
), BomQty AS
( SELECT [ID], [FileId] AS [Current], [RefCount] AS [Total], 1 As Level
FROM Data
WHERE ParentID = 0
UNION ALL
SELECT Data.[ID], Data.[FileId],
Data.[RefCount] * BomQty.[Total], BomQty.Level + 1
FROM BomQty -- Magic happens here
JOIN Data
ON Data.[ParentID] = BomQty.[Current]
)
SELECT [Current], SUM(Total) Quantity
FROM BomQty
GROUP
BY [Current]
- 1 x 140072
- 1 x 140068
- 1 x 140066
- 6 x
140129
- 6 x
- 1 x 140066
- 1 x 140068
- 1 x 140087
- 1 x 140083
- 1 x 140081
- 3个
140129
- 3个
- 1 x 140081
- 1 x 140083
- 1 x 140117
- 2 x 140113
- 2x140111
- 6 x
140129
- 6 x
- 2x140111
- 2 x 140113
- 1 x 140145
- 1 x 140139
- 3个
140129
- 3个
- 1 x 140139
这意味着您总共需要36个
140129
零件,对吗?@RubensFarias-是的,这是一个打字错误。140111是正确的。所以您想对FileID和直接父项求和RefCount
,对吗?或者一直到顶部?它应该是每行的总计数,所以到顶部。在这种情况下,24是RefCount的正确和。我得到23。我错过了什么?我将在下面发布我的解决方案,但我确信有更好的方法来实现这一点。@Jon请参阅我对鲁本回答的评论。每个项目的计数是其RefCount
乘以其父项RefCount
,然后求和。总数应为24。RefCount
是顶层中每个项目的数量。由于140129位于父140111中,数量为6,且该项目的RefCount
为2,因此该项目的总数为12。140 129人的总数是24人。我需要将FileID
的RefCount
乘以父级RefCount
。这将适用于此示例数据集,但遗憾的是,对于完整的BOM表来说,这是不正确的,因为级别会有所不同。@ehcanada,反转树,现在检查它查看数据,是的,您是正确的,这可能就是我各种尝试失败的原因。谢谢你的回答!
;WITH Data AS
( SELECT *
FROM (
VALUES (01, 'DemoParent', 0, 139209, 1),
(02, '78200', 139209, 140072, 1),
(03, '78180', 139209, 140087, 1),
(04, '78160', 139209, 140117, 1),
(05, '78140', 139209, 140145, 1),
(06, '78148', 140066, 140129, 6),
(07, '78203', 140068, 140066, 1),
(08, '78202', 140072, 140068, 1),
(09, '78148', 140081, 140129, 3),
(10, '78183', 140083, 140081, 1),
(11, '78182', 140087, 140083, 1),
(12, '78148', 140111, 140129, 6),
(13, '78163', 140113, 140111, 2),
(14, '78162', 140117, 140113, 2),
(15, '78148', 140139, 140129, 3),
(16, '78143', 140145, 140139, 1)
) Data([ID], [PartName], [ParentID], [FileID], [RefCount])
), BomQty AS
( SELECT [ID], [FileId] AS [Current], [RefCount] AS [Total], 1 As Level
FROM Data
WHERE ParentID = 0
UNION ALL
SELECT Data.[ID], Data.[FileId],
Data.[RefCount] * BomQty.[Total], BomQty.Level + 1
FROM BomQty -- Magic happens here
JOIN Data
ON Data.[ParentID] = BomQty.[Current]
)
SELECT [Current], SUM(Total) Quantity
FROM BomQty
GROUP
BY [Current]