我在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
我假设您从事制造业,您指的是物料清单?如果是这样,我也是,所以这对我们来说很有效。如果没有,我道歉。
你很接近。 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
)