首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归地爆炸组件以获得总价值。

递归地爆炸组件以获得总价值。
EN

Stack Overflow用户
提问于 2015-05-06 12:21:59
回答 1查看 349关注 0票数 3

TL-TR:我想得到最后一件物品的总价值,它是由别人做的,而我就是从它那里得到购买价格的。问题是半成品。

考虑三种类型的项目:

  • 最终项目:--它是由原始项目和/或半成品组成的。这些是我想得到的总价值。
  • 半成品:它是由原始物品和/或半成品制成的。
  • 原料项目:--我有一个单位的成本。

. can =‘can 5’>最后一个项目,除其他事项外,还可以是另一个半成品.在一个undeterminate数量的水平,直到你得到所有的原始项目。

我知道如何在C#上做到这一点,但我对纯SQL解决方案感兴趣,我认为这是可行的。

此处提供的SQL Fiddle:

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

这是我在查询中所能得到的.

代码语言:javascript
运行
复制
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

当然,这并不是将半成品价格计算到总和中,因为它们并不存在于价格表中。

编辑:另一次尝试,但它带来了一个错误,即在递归查询中不允许分组。

代码语言:javascript
运行
复制
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

以及一些期望输出的例子(在浅灰色中,必须用黑色的数据来计算):

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-06 13:08:57

您需要使用递归查询:

SQL Fiddle

查询1

代码语言:javascript
运行
复制
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

结果

代码语言:javascript
运行
复制
| output |                   |
|--------|-------------------|
| Item 3 | 64.32000000000001 |
| Semi 1 |                63 |
| Semi 2 |              60.4 |
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30076613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档