问:
SELECT T0.[Code] FATHER, T1.[Code], T1.[Quantity]/T0.[Qauntity] Quantity FROM OITT T0 INNER JOIN ITT1 T1 ON T0.Code = T1.Father WHERE T0.[Code] ='M06003800000000'
不要修改上述代码
把bom按照father展开
加一列 qty ,他的值是各级Quantity相乘
初始部分和递归部分的列类型必须完全匹配。强制类型转换确保列类型一致。
GPT:
要按照给定的SQL查询展开BOM并计算每个组件的总数量,你可以使用递归CTE(Common Table Expression)来实现。下面是一个示例SQL查询,假设你的表结构和数据可以支持递归查询:
WITH RecursiveBOM AS ( -- 初始部分:选择顶层组件的代码、代码、数量,并初始化递归 SELECT T0.[Code] AS Father, T1.[Code], T1.[Quantity], CAST(T1.[Quantity] AS DECIMAL(18,4)) AS Qty FROM OITT T0 INNER JOIN ITT1 T1 ON T0.Code = T1.Father WHERE T0.[Code] = 'M06003800000000' UNION ALL -- 递归部分:连接父组件和子组件,计算数量的乘积 SELECT rb.Father, t1.[Code], t1.[Quantity], CAST(rb.Qty * t1.Quantity AS DECIMAL(18,4)) AS Qty FROM RecursiveBOM rb INNER JOIN ITT1 t1 ON rb.Code = t1.Father ) -- 最终选择递归结果集 SELECT Father, Code, Qty AS Quantity FROM RecursiveBOM ORDER BY Father, Code;
这个查询的关键点包括:
使用递归CTE RecursiveBOM 来展开BOM。在初始部分,选择顶层组件的代码、代码、数量,并初始化递归。在递归部分,连接父组件和子组件,计算数量的乘积,并继续递归下去直到没有更多的子组件为止。
强制类型转换确保所有列的类型匹配,这在SQL Server中是很重要的,特别是涉及到数值计算时。
最后,选择递归结果集,并按照Father和Code排序以便清晰展示BOM的结构。
请注意,具体的数据类型转换和精度取决于你的实际需求和数据库的支持。
问:如果某一行数据有下一级,就把上一级删除
GPT:理解你的需求,如果某一行数据有下一级(子组件),则删除该行的上一级数据。这可以通过调整递归查询的方式来实现,确保只选择最底层的组件数据。以下是修改后的SQL查询:
WITH RecursiveBOM AS ( -- 初始部分:选择顶层组件的代码、代码、数量,并初始化递归 SELECT T0.[Code] AS Father, T1.[Code], T1.[Quantity], CAST(T1.[Quantity] AS DECIMAL(18,4)) AS Qty, 1 AS Level -- 初始级别为1 FROM OITT T0 INNER JOIN ITT1 T1 ON T0.Code = T1.Father WHERE T0.[Code] = 'M06003800000000' UNION ALL -- 递归部分:连接父组件和子组件,计算数量的乘积 SELECT rb.Father, t1.[Code], t1.[Quantity], CAST(rb.Qty * t1.Quantity AS DECIMAL(18,4)) AS Qty, rb.Level + 1 -- 级别加1 FROM RecursiveBOM rb INNER JOIN ITT1 t1 ON rb.Code = t1.Father ) -- 最终选择递归结果集,只保留最底层的子组件数据 SELECT rb.Father, rb.Code, rb.Qty AS Quantity FROM RecursiveBOM rb WHERE NOT EXISTS ( -- 使用NOT EXISTS来排除有子组件的行 SELECT 1 FROM ITT1 t1 WHERE t1.Father = rb.Code ) ORDER BY rb.Father, rb.Code;
这个修改后的查询的关键点是:
在递归CTE RecursiveBOM 中添加一个 Level 列来跟踪每个组件在BOM中的级别。
在最终的查询中,使用 NOT EXISTS 子查询来排除那些有子组件的行,确保只选择最底层的子组件数据。
最后,按照Father和Code排序以展示清晰的BOM结构。
这样做可以确保每一行数据只保留最底层的子组件,删除了拥有子组件的上级数据。
以上内容如果对你有用,请收藏。
评论列表: