如果我想对bmb01相同的ima53进行递归求和,应该如何修改
时间: 2024-02-29 08:53:29 浏览: 23
如果您想对bmb01相同的ima53进行递归求和,可以将上面的SQL语句做如下修改:
```
WITH RECURSIVE cte(bmb01, bmb03, ima53) AS (
SELECT bmb01, bmb03, ima53
FROM DS_REPORT.ABMR801110755ERP
WHERE bmb01 = 'A801'
UNION ALL
SELECT b.bmb01, b.bmb03, c.ima53 + b.ima53
FROM DS_REPORT.ABMR801110755ERP b
JOIN cte c ON b.bmb03 = c.bmb01
)
SELECT bmb01, SUM(ima53) AS total_cost
FROM cte
GROUP BY bmb01;
```
这里的修改有两点:
1. 在cte公共表达式中,将第二个SELECT语句中的ON条件由c.bmb03 = b.bmb01改为b.bmb03 = c.bmb01。这样做的目的是将每个部门的子部门的成本累加到其上级部门的成本中,从而实现对bmb01相同的ima53递归求和。
2. 在SELECT语句中,将GROUP BY子句中的bmb03去掉,只保留bmb01。这样做的目的是按照部门编码bmb01分组,并计算每个分组的ima53的总和,得到每个部门及其子部门的成本总和。
相关问题
WITH RECURSIVE cte(bmb01, bmb03, ima53) AS ( SELECT bmb01, bmb03, ima53 FROM DS_REPORT.ABMR801110755ERP WHERE bmb01 = 'A801' UNION ALL SELECT b.bmb01, b.bmb03, c.ima53 + b.ima53 FROM DS_REPORT.ABMR801110755ERP b JOIN cte c ON b.bmb01 = c.bmb03 ) SELECT bmb01,bmb03, SUM(ima53) AS total_cost FROM cte GROUP BY bmb01,bmb03; 缺失哪些关键字
这个 SQL 查询语句是使用 WITH RECURSIVE 关键字创建递归公共表表达式(CTE),其中 cte 是递归表的名称。递归表的查询分为两个部分:
1. 基本查询:查询 ABMR801110755ERP 表中 bmb01 = 'A801' 的记录,并将 bmb01、bmb03 和 ima53 列作为递归表的初始记录集。
2. 递归查询:基于递归表的结果集,使用 JOIN 子句将 ABMR801110755ERP 表中 bmb01 = c.bmb03 的记录与递归表连接,计算每个记录的成本 ima53,并将结果加到递归表中的 ima53 值上,以形成新的记录集。
最后,使用 SELECT 和 GROUP BY 子句从递归表中检索结果,其中 bmb01 和 bmb03 是分组列,SUM(ima53) 是总成本列。
因此,这个 SQL 查询语句并没有缺失任何关键字。
用 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 代码可以满足你的需求。如果你有任何疑问或需要进一步的帮助,请随时告诉我。