TL-TR:我想得到最后一件物品的总价值,它是由别人做的,而我就是从它那里得到购买价格的。问题是半成品。
考虑三种类型的项目:
. can =‘can 5’>最后一个项目,除其他事项外,还可以是另一个半成品.在一个undeterminate数量的水平,直到你得到所有的原始项目。
我知道如何在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
以及一些期望输出的例子(在浅灰色中,必须用黑色的数据来计算):
发布于 2015-05-06 13:08:57
您需要使用递归查询:
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
结果
| output | |
|--------|-------------------|
| Item 3 | 64.32000000000001 |
| Semi 1 | 63 |
| Semi 2 | 60.4 |
https://stackoverflow.com/questions/30076613
复制相似问题