CTE 用于计算 material 数量的账单
CTE For computing bill of material quantity
鉴于此 SQL Fiddle,我试图找出文件 ID 为 140129 的项目的正确数量。查询 returns 18,但总计应为 24 作为父项FileID 140111 的数量是 2。我尝试了各种地方将父项乘以子项,但我遇到了心理障碍。有什么建议吗?
CREATE TABLE Table1
([ID] int, [PartName] varchar(10), [ParentID] int, [FileID] int, [RefCount] int)
;
INSERT INTO Table1
([ID], [PartName], [ParentID], [FileID], [RefCount])
VALUES
(1, 'DemoParent', 0, 139209, 1),
(2, '78200', 139209, 140072, 1),
(3, '78180', 139209, 140087, 1),
(4, '78160', 139209, 140117, 1),
(5, '78140', 139209, 140145, 1),
(6, '78148', 140066, 140129, 6),
(7, '78203', 140068, 140066, 1),
(8, '78202', 140072, 140068, 1),
(9, '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)
;
;WITH BomQty (ParentFileID, FileID, RefCount)
AS
(
SELECT t1.ParentID, t1.FileID, t1.RefCount
FROM Table1 t1
WHERE t1.ParentID = 0
UNION ALL
SELECT t1.ParentID, t1.FileID, t1.RefCount
FROM Table1 t1
INNER JOIN BomQty AS bq
ON t1.ParentID = bq.FileID
)
SELECT bq.FileID, SUM(bq.RefCount)
FROM BomQty bq
WHere FileID = 140129
GROUP BY bq.FileID
SELECT FileID, SUM(RefCount) +
(
SELECT SUM(RefCount) As ParentSum
FROM Table1 t
WHERE FileID IN(SELECT ParentID FROM Table1 t2 WHERE FileID = 140129)
)
FROM Table1 t
WHERE FileID = 140129
GROUP BY FileID;
您需要将 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]
我正在这样阅读您的数据:
- 要生产 1 x 139209,您需要:
- 1 x 140072
- 1 x 140068
- 1 x 140066
- 6 x
140129
- 1 x 140087
- 1 x 140083
- 1 x 140081
- 3 x
140129
- 1 x 140117
- 2 x 140113
- 2 x 140111
- 6 x
140129
- 1 x 140145
- 1 x 140139
- 3 x
140129
这意味着您总共需要 36 x 140129
个零件,对吧?
鉴于此 SQL Fiddle,我试图找出文件 ID 为 140129 的项目的正确数量。查询 returns 18,但总计应为 24 作为父项FileID 140111 的数量是 2。我尝试了各种地方将父项乘以子项,但我遇到了心理障碍。有什么建议吗?
CREATE TABLE Table1
([ID] int, [PartName] varchar(10), [ParentID] int, [FileID] int, [RefCount] int)
;
INSERT INTO Table1
([ID], [PartName], [ParentID], [FileID], [RefCount])
VALUES
(1, 'DemoParent', 0, 139209, 1),
(2, '78200', 139209, 140072, 1),
(3, '78180', 139209, 140087, 1),
(4, '78160', 139209, 140117, 1),
(5, '78140', 139209, 140145, 1),
(6, '78148', 140066, 140129, 6),
(7, '78203', 140068, 140066, 1),
(8, '78202', 140072, 140068, 1),
(9, '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)
;
;WITH BomQty (ParentFileID, FileID, RefCount)
AS
(
SELECT t1.ParentID, t1.FileID, t1.RefCount
FROM Table1 t1
WHERE t1.ParentID = 0
UNION ALL
SELECT t1.ParentID, t1.FileID, t1.RefCount
FROM Table1 t1
INNER JOIN BomQty AS bq
ON t1.ParentID = bq.FileID
)
SELECT bq.FileID, SUM(bq.RefCount)
FROM BomQty bq
WHere FileID = 140129
GROUP BY bq.FileID
SELECT FileID, SUM(RefCount) +
(
SELECT SUM(RefCount) As ParentSum
FROM Table1 t
WHERE FileID IN(SELECT ParentID FROM Table1 t2 WHERE FileID = 140129)
)
FROM Table1 t
WHERE FileID = 140129
GROUP BY FileID;
您需要将 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]
我正在这样阅读您的数据:
- 要生产 1 x 139209,您需要:
- 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 x
140129
- 3 x
- 1 x 140081
- 1 x 140083
- 1 x 140117
- 2 x 140113
- 2 x 140111
- 6 x
140129
- 6 x
- 2 x 140111
- 2 x 140113
- 1 x 140145
- 1 x 140139
- 3 x
140129
- 3 x
- 1 x 140139
- 1 x 140072
这意味着您总共需要 36 x 140129
个零件,对吧?