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;
时间: 2024-02-02 07:03:45 浏览: 53
这是一个使用递归查询的SQL语句。递归查询是指在查询过程中使用了自己查询自己的方式,通常用于处理树形结构数据,比如部门树、分类树等。
具体来说,这个SQL语句的作用是查询表DS_REPORT.ABMR801110755ERP中以'A801'为根节点的部门及其子部门的成本总和。其中,bmb01是部门编码,bmb03是部门的上级编码,ima53是部门的成本。
递归查询的过程如下:
1. 首先,从ABMR801110755ERP表中选取bmb01为'A801'的部门,将它的bmb01、bmb03和ima53三列作为结果集的一部分。
2. 然后,以这个部门为基础,再次从ABMR801110755ERP表中查询与它有关系的部门,也就是它的子部门,将这些子部门的bmb01、bmb03和ima53三列加入结果集。这里用到了UNION ALL关键字,表示两个查询结果集的并集。
3. 接下来,对于每个子部门,重复步骤2,查询它的子部门并将其加入结果集。这个过程将会一直持续下去,直到没有更多的子部门为止。
4. 最后,对结果集按照bmb01和bmb03进行分组,计算每个分组的ima53的总和,得到每个部门及其子部门的成本总和。
注意,这个查询使用了CTE(公共表达式)来定义递归查询的过程,CTE是一种在SQL语句中定义临时表的方式,常用于递归查询和复杂的分析查询。
相关问题
如果我想对bmb01相同的ima53进行递归求和,应该如何修改
如果您想对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的总和,得到每个部门及其子部门的成本总和。
有一个表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 的记录,即成品的记录,将它的元件料号和成本价加入递归结果集中。然后在每轮递归中,根据上一轮的结果集中的元件料号,找到对应的主件料号和该元件的成本价,将两者相加得到该主件的成本价,并继续递归。
最后将所有主件料号的成本价加和,即可得到所有料件的成本价。注意,这里的成本价是指所有元件的采购价格之和,不包括加工成本等其他成本。如有需要,可以根据实际情况进行调整。
阅读全文