从多级BOM计算产品的价格

问题描述 投票:0回答:1

我在sql方面不是很先进,我读了很多关于cte和递归查询来扩展bom的内容,但我仍然不知道如何解决我的问题。

我的桌子是这样的:

DB_PARENT 数据库组件 DB_COEFF
S135427 M134842 0,05122125
S135695 M134905 0,2871687
F133818 S135482 0,5
S135424 S135423 1
S135424 M134534 1
F133783 S135454 1
F133924 S178585 1
S135602 S135599 1
S135087 M134609 0,068
F133353 M134684 0,085867225
F133513 S135287 1
S178407 M134591 2
S135438 M178128 9,663
S135619 S135622 1
S135619 S135628 1

我需要计算 DB_parent 列中存在的每种产品的价格。

每种产品都可以由原材料或另一种半成品组成。

db_parent 列上的某些产品有超过 1 行,因为它们可以由超过 1 种东西组成(原材料或半成品)。

我需要分解每种产品以获得原材料,并将其乘以“db-coeff”列。

因此,例如,如果产品是由原材料和半成品制成的,我必须首先将原材料乘以 db-coeff,然后查看半成品是如何制成的并计算半成品,然后将两者相加。

我该怎么做? 我快要疯了

谢谢

我尝试了一些递归查询,但效果不佳 这是我尝试过的查询:

with a as(
  SELECT [dbo].[ANAG_DBASE].DB_PARENT, [dbo].[ANAG_DBASE].DB_COMPONENT, 1 * [dbo].[ANAG_DBASE].DB_COEFF as price, 1 as level,
  convert(varchar(max), [dbo].[ANAG_DBASE].DB_COMPONENT) as path
  FROM [dbo].[ANAG_DBASE]
 
  UNION ALL
  SELECT [dbo].[ANAG_DBASE].DB_PARENT, [dbo].[ANAG_DBASE].DB_COMPONENT, 1 * [dbo].[ANAG_DBASE].DB_COEFF as price, a.level + 1 as level,
  a.path + '/' + [dbo].[ANAG_DBASE].DB_COMPONENT
  FROM a
  INNER JOIN [dbo].[ANAG_DBASE] ON a.DB_PARENT = [dbo].[ANAG_DBASE].DB_COMPONENT)
select DB_PARENT, sum(price), level from a
group by DB_PARENT, level
sql t-sql common-table-expression recursive-query
1个回答
0
投票

我假设您从事制造业,您指的是物料清单?如果是这样,我也是,所以这对我们来说很有效。如果没有,我道歉。

你很接近。 CTE 首先需要有一个锚作为 UNION 之上的第一个查询。该锚点应该是所有具有物料清单的父组件的选择。

UNION 之后的第二条语句应该是父程序集层次结构内的成员(锚语句)

在您联合之后,我注意到您这样做了:

INNER JOIN [dbo].[ANAG_DBASE] ON a.DB_PARENT = [dbo].[ANAG_DBASE].DB_COMPONENT)

但是我们要从父级转到子级,所以将其反转为:
INNER JOIN [dbo].[ANAG_DBASE] ON [dbo].[ANAG_DBASE].DB_PARENT = a.DB_COMPONENT)

DECLARE @ASSEMBLY nvarchar(30) = 'S135423';
;WITH CTE_BOM AS (
    SELECT 
        DB_PARENT, 
        DB_COMPONENT, 
        DB_COEFF, 
        1 AS [lvl], 
        CAST(DB_PARENT + '-->' + DB_COMPONENT as nvarchar(max)) as PATH
    FROM ANAG_DBASE 
    WHERE DB_PARENT = @ASSEMBLY --comment this row out if you want all of your assemblys' BOMs blown out
    UNION ALL
    SELECT 
        c.DB_PARENT, 
        c.DB_COMPONENT, 
        c.DB_COEFF,  
        [lvl] = b.lvl + 1, 
        PATH + '-->' + c.COMPONENT_ID
    FROM CTE_BOM b
    INNER JOIN ANAG_DBASE c ON b.DB_COMPONENT = c.DB_PARENT
)
© www.soinside.com 2019 - 2024. All rights reserved.