Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 计算物料清单数量的CTE_Sql Server_Common Table Expression - Fatal编程技术网

Sql server 计算物料清单数量的CTE

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,

有鉴于此,我正试图找出文件ID为140129的项目的正确数量。查询返回18,但总数应为24,因为FileID 140111的父数量为2。我试过在不同的地方让父母和孩子相乘,但我有一个心理障碍。有什么建议吗


您需要将
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 139209,您需要:
    • 1 x 140072
      • 1 x 140068
        • 1 x 140066
          • 6 x
            140129
    • 1 x 140087
      • 1 x 140083
        • 1 x 140081
          • 3个
            140129
    • 1 x 140117
      • 2 x 140113
        • 2x140111
          • 6 x
            140129
    • 1 x 140145
      • 1 x 140139
        • 3个
          140129

  • 这意味着您总共需要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]