请仅用bmb01(主件料号),bmb03(元件料号),bmb53(成本)三个字段
时间: 2023-07-20 15:23:53 浏览: 69
好的,以下是仅使用 bmb01(主件料号),bmb03(元件料号),bmb53(成本)三个字段递归求所有料件的成本价的 SQL 语句:
```
WITH cte(bmb01, bmb03, cost) AS (
SELECT bmb01, bmb03, bmb53
FROM bmb_file
WHERE bmb01 IS NULL
UNION ALL
SELECT b.bmb01, b.bmb03, c.cost + b.bmb53
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;
```
这个 SQL 语句与前面的语句类似,只是只选取了三个字段,并在递归查询中只包括了这三个字段。具体来说,我们在递归查询的第一部分中选取主件料号为 NULL 的记录,并将它的元件料号和成本价加入递归结果集中;在递归查询的第二部分中,我们根据上一轮的结果集中的元件料号,找到对应的主件料号和该元件的成本价,将两者相加得到该主件的成本价,并继续递归。
最后将所有主件料号的成本价加和,即可得到所有料件的成本价。
相关问题
有一个表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 的记录,即成品的记录,将它的元件料号和成本价加入递归结果集中。然后在每轮递归中,根据上一轮的结果集中的元件料号,找到对应的主件料号和该元件的成本价,将两者相加得到该主件的成本价,并继续递归。
最后将所有主件料号的成本价加和,即可得到所有料件的成本价。注意,这里的成本价是指所有元件的采购价格之和,不包括加工成本等其他成本。如有需要,可以根据实际情况进行调整。
我要查料号为A的BOM成本结构表用上述代码怎么写
好的,如果您要查询料号为 A 的 BOM 成本结构表,可以将上面的 SQL 语句中的表名 `bmb_file` 替换为您的表名,然后在最后加上一个 `WHERE` 子句来限定条件,如下所示:
```
WITH cte(bmb01, bmb03, cost) AS (
SELECT bmb01, bmb03, bmb53
FROM your_table_name
WHERE bmb01 = 'A' -- 指定主件料号为 A
UNION ALL
SELECT b.bmb01, b.bmb03, c.cost + b.bmb53
FROM your_table_name b
JOIN cte c ON b.bmb01 = c.bmb03
)
SELECT bmb01, bmb03, cost
FROM cte
WHERE bmb01 IS NOT NULL; -- 查询所有元件料号和对应的成本
```
这个 SQL 语句与之前的语句类似,只是在第一部分中增加了一个 `WHERE` 子句来限定主件料号为 A,然后在最后的查询中包括了元件料号和对应的成本。如果您只需要查询元件料号和对应的成本,可以去掉 `SELECT` 子句中的 `bmb01` 字段。