递归分解组件以获得总值
Explode components recursively to get total value
TL-TR: 我想获得由他人制成的最终商品的总价值,我从中得到购买价格。问题是半成品。
考虑三种类型的项目:
- 最终产品: 它由原材料 and/or 半成品制成。这些是我想要得到的总值。
- 半成品:它是用原料制成的 and/or 半成品。
- 原始项目:我有这些产品的单位成本。
最终产品可以由半成品制成,除其他外,半成品可以由另一个半成品制成,依此类推... 不确定 级别数,直到你得到所有原始项目。
我知道如何在 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
以及预期输出的一些示例(浅灰色必须计算,黑色是数据):
您需要使用递归查询:
查询 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
| output | |
|--------|-------------------|
| Item 3 | 64.32000000000001 |
| Semi 1 | 63 |
| Semi 2 | 60.4 |
TL-TR: 我想获得由他人制成的最终商品的总价值,我从中得到购买价格。问题是半成品。
考虑三种类型的项目:
- 最终产品: 它由原材料 and/or 半成品制成。这些是我想要得到的总值。
- 半成品:它是用原料制成的 and/or 半成品。
- 原始项目:我有这些产品的单位成本。
最终产品可以由半成品制成,除其他外,半成品可以由另一个半成品制成,依此类推... 不确定 级别数,直到你得到所有原始项目。
我知道如何在 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
以及预期输出的一些示例(浅灰色必须计算,黑色是数据):
您需要使用递归查询:
查询 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
| output | |
|--------|-------------------|
| Item 3 | 64.32000000000001 |
| Semi 1 | 63 |
| Semi 2 | 60.4 |