【问题标题】:Explode components recursively to get total value递归分解组件以获得总值
【发布时间】:2015-05-06 12:21:59
【问题描述】:

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

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

【问题讨论】:

  • 这可能是我这几天在这里看到的最完整的问题之一。

标签: sql sql-server recursive-query


【解决方案1】:

你需要使用递归查询:

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 |

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2014-12-28
    • 2020-06-17
    • 2019-11-26
    • 2015-08-23
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2021-06-03
    相关资源
    最近更新 更多