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. 生产 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 个零件,对吧?