递归分解组件以获得总值

Explode components recursively to get total value

TL-TR: 我想获得由他人制成的最终商品的总价值,我从中得到购买价格。问题是半成品。

考虑三种类型的项目:

最终产品可以由半成品制成,除其他外,半成品可以由另一个半成品制成,依此类推... 不确定 级别数,直到你得到所有原始项目。

我知道如何在 C# 上执行此操作,但我对纯粹的 SQL 解决方案感兴趣,我认为它是可行的。

SQL Fiddle 此处提供:

http://sqlfiddle.com/#!6/138c3

这就是我通过查询所能得到的...

SELECT BOM.output, SUM(P.price * BOM.quantity) as Total
FROM BOM
INNER JOIN 
Prices P ON P.input = BOM.Input
GROUP BY BOM.output

当然,这不会将半成品价格计入总和,因为它们不存在于价格中 table。

编辑: 另一次尝试,但它给出了递归查询中不允许分组的错误。

WITH cte_table AS (
SELECT BOM.output, SUM(P.price * BOM.quantity) as Total
FROM BOM
INNER JOIN 
Prices P ON P.input = BOM.Input
GROUP BY BOM.output

UNION ALL
SELECT BOM.output, SUM(ISNULL(P.price,T.Total) * BOM.quantity) as Total
FROM BOM
LEFT JOIN 
Prices P ON P.input = BOM.Input
LEFT JOIN 
cte_table T ON T.output = BOM.Input
GROUP BY BOM.output
)
SELECT *
FROM cte_table

以及预期输出的一些示例(浅灰色必须计算,黑色是数据):

您需要使用递归查询:

SQL Fiddle

查询 1:

with a as(
  SELECT BOM.output, BOM.input, P.price * BOM.quantity as price, 1 as level,
  convert(varchar(max), BOM.input) as path
  FROM BOM
  INNER JOIN 
  Prices P ON P.input = BOM.Input
  UNION ALL
  SELECT BOM.output, BOM.input, a.price * BOM.quantity as price, a.level + 1 as level,
  a.path + '/' + bom.input
  FROM a
  INNER JOIN BOM ON a.output = BOM.Input)
select output, sum(price) from a
group by output
-- select * from a

Results:

| output |                   |
|--------|-------------------|
| Item 3 | 64.32000000000001 |
| Semi 1 |                63 |
| Semi 2 |              60.4 |