有一个表bmb_file,是一个BOM表,bmb01是主件料号,bmb03是元件料号,成品没有主件料号,bmb01=null;半成品即做主件,也做元件,原材料只做元件,bmb53是原材料的采购价格,半成品和成品的价格为组成它的原材料或者半成品的和,假如原材料如树状图结构,已经用先序遍历得出了1-11的一个成品的bom表,请用一个递归求所有料件的成本价
时间: 2024-02-29 21:52:03 浏览: 158
好的,我理解了你的问题。根据你的描述,我假设每个料件的成本价等于其本身的价格加上它所包含的所有元件的成本价之和。以下是一个递归的SQL查询,可以求出树状结构中每个料件的成本价:
```sql
WITH RECURSIVE bom_tree AS (
-- 先将成品加入递归表达式
SELECT bmb01, bmb03, bmb53, bmb53 AS cost
FROM bmb_file
WHERE bmb01 = '1'
UNION ALL
-- 递归查询元件
SELECT b.bmb01, b.bmb03, b.bmb53, b.bmb53 + t.cost
FROM bmb_tree t
JOIN bmb_file b ON t.bmb03 = b.bmb01
)
-- 最终查询结果
SELECT bmb03, cost
FROM bom_tree
WHERE bmb01 IS NULL
```
这个SQL查询使用了递归公共表达式(WITH RECURSIVE),先将成品加入递归表达式,然后递归查询元件,计算每个元件的成本价。最后,查询结果只包含元件的料号和成本价,其中bmb01为空的记录表示原材料。
相关问题
有一个表bmb_file,是一个BOM表,bmb01是主件料号,bmb03是元件料号,成品没有主件料号,bmb01=null;半成品即做主件,也做元件,原材料只做元件,bmb53是原材料的采购价格,半成品和成品的价格为它所有元件的价格之和,请用一个递归求所有料件的成本价
好的,根据您提供的表结构,可以使用以下 SQL 语句递归求所有料件的成本价:
```
WITH RECURSIVE cte AS (
SELECT bmb01, bmb03, bmb06, bmb53, bmb06 AS cost
FROM bmb_file
WHERE bmb01 IS NULL
UNION ALL
SELECT b.bmb01, b.bmb03, b.bmb06, b.bmb53, c.cost + b.bmb06 * b.bmb53 AS cost
FROM bmb_file b
JOIN cte c ON b.bmb01 = c.bmb03
)
SELECT bmb01, SUM(cost) AS total_cost
FROM cte
WHERE bmb01 IS NOT NULL
GROUP BY bmb01;
```
这个递归查询的思路是首先找到主件料号为 NULL 的记录,即成品的记录,将它的元件料号和成本价加入递归结果集中。然后在每轮递归中,根据上一轮的结果集中的元件料号,找到对应的主件料号和该元件的成本价,将两者相加得到该主件的成本价,并继续递归。
最后将所有主件料号的成本价加和,即可得到所有料件的成本价。注意,这里的成本价是指所有元件的采购价格之和,不包括加工成本等其他成本。如有需要,可以根据实际情况进行调整。
用 WITH bom_tree(bmb01, bmb03, bmb53) AS ( -- 先将成品加入递归表达式 SELECT bmb01, bmb03, bmb53 FROM bmb_file WHERE bmb01 = '1' UNION ALL -- 递归查询元件 SELECT b.bmb01, b.bmb03, SUM(b.bmb53 * t.bmb53) AS cost FROM bom_tree t JOIN bmb_file b ON t.bmb03 = b.bmb01 WHERE b.bmb04 = '1' -- 只查询原材料 GROUP BY b.bmb01, b.bmb03)-- 最终查询结果 SELECT bmb03, SUM(bmb53) AS cost FROM bom_tree WHERE bmb01 IS NULL GROUP BY bmb03;这个代码优化,价格不再是bmb表中的bmb53,而是ima_file中的ima53,ima_file 是料件信息表,ima01是料件编号
根据你的描述,我了解到你想要对使用递归查询所有料件的成本价的 SQL 代码进行优化,使其可以使用 `ima_file` 表中的 `ima53` 价格来计算成本价。下面是修改后的 SQL 代码:
```
WITH bom_tree(bmb01, bmb03, cost) AS (
-- 先将成品加入递归表达式
SELECT bmb01, bmb03, CAST(NULL AS DECIMAL(18, 4)) AS cost
FROM bmb_file
WHERE bmb01 = '1'
UNION ALL
-- 递归查询元件
SELECT b.bmb01, b.bmb03, CAST(SUM(COALESCE(i.ima53, b.bmb53) * t.cost) AS DECIMAL(18, 4)) AS cost
FROM bom_tree t
JOIN bmb_file b ON t.bmb03 = b.bmb01
LEFT JOIN ima_file i ON i.ima01 = b.bmb03
WHERE b.bmb04 = '1' -- 只查询原材料
GROUP BY b.bmb01, b.bmb03
)
-- 最终查询结果
SELECT bmb03, CAST(SUM(cost) AS DECIMAL(18, 4)) AS cost
FROM bom_tree
WHERE bmb01 IS NULL
GROUP BY bmb03;
```
在这个修改后的 SQL 代码中,我们使用了一个 `ima_file` 表来获取所有原材料的 `ima53` 价格。具体来说,我们在递归查询中使用了一个 `LEFT JOIN` 来将 `bmb_file` 表和 `ima_file` 表连接起来,如果某个元件在 `ima_file` 表中存在对应的 `ima53` 价格,则使用该价格来计算成本价;否则,仍然使用 `bmb53` 价格来计算成本价。另外,我们在递归查询的结果集中添加了一个 `cost` 字段来存储当前料件的成本价。
最终,我们在查询结果时,对所有 `bmb01` 为 `NULL` 的记录进行分组并求和,得到每个料件的总成本价。
希望这个修改后的 SQL 代码可以满足你的需求。如果你有任何疑问或需要进一步的帮助,请随时告诉我。
阅读全文