递归地分解组件以获得总值

时间:2015-05-06 12:22:00

标签: sql sql-server recursive-query

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

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

Example

1 个答案:

答案 0 :(得分:2)

您需要使用递归查询:

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 |