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
但当然,由于它们不存在于价格表中,因此并未将半成品价格纳入总和。
编辑:另一次尝试,但它会在递归查询中出现错误,即分组不允许。
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
预期输出的一些例子(浅灰色必须计算,黑色是数据):
答案 0 :(得分:2)
您需要使用递归查询:
查询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 |