惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
云风的 BLOG
云风的 BLOG
小众软件
小众软件
F
Fortinet All Blogs
爱范儿
爱范儿
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
C
Check Point Blog
博客园 - 聂微东
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
Vercel News
Vercel News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
A
About on SuperTechFans
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog
宝玉的分享
宝玉的分享
Jina AI
Jina AI
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - AaronLi

E10——打印行序 E10——计算品号的使用情况(最近五年):连续X年在用 SQL&ERP——通过品号递归BOM往上找到最top的主件 E10——在线建档,单头取单身行的数据 SQLSERVER——XML转数据表输出(E10的PickList转成数据表) SQLServer数据库日志太大收缩操作指南 泛微OA——修改数据库密码 泛微OA——建模-查询,链接字段跳转到流程的路径写法 SQLSERVER——PIVOT列转行 SQL——练习:上展BOM SQL——练习:往下展开BOM SQL——CHARINDEX,找到字符(char)的位置(index) Sqlserver 根据年月获取第一天和最后一天 EXCEL生成GUID 多种格式 E10——智能菜单 [转] 判断表(临时表),存储过程是否存在 E10——凭证报表序号按流水自然排序 E10——函数GetTimeDiff(DateTime dt1,DateTime dt2,int type) E10——GetEntityProperty方法 E10——脚本中GUID的值如何判断是否相等?
E10——BOM展下阶CTE写法
AaronLi · 2026-03-16 · via 博客园 - AaronLi

问AI:

BOM主表:BOM(主键BOM_ID);
BOM子表:BOM_D(主键BOM_D_ID);
品号表:ITEM(主键ITEM_BUSINESS_ID);

BOM主表字段:ITEM_ID主件品号(关联品号表的主键);
BOM子表字段:BOM_ID关联BOM主表,SOURCE_ID_ROid元件品号ID(关联品号表的主键),QTY_PER组成用量,EFFECTIVE_DATE生效日期,EXPRITY_DATE失效日期;
品号表:ITEM_CODE品号,ITEM_NAME品名;

数据库是SQLSERVER2008,根据以上数据表的逻辑关系,我要根据BOM的主件品号,获取该BOM的所有下阶子品号,并统计所有下阶子品号的累计组成用量;
查询结果列:主件品号、主件品名、子品号、子品名、组成用量、累计组成用量、生效时间、失效时间、层级关系(即显示该子品号的所有上阶品号,比如子品号是370030045,则此列显示为220050008.160120218.160100207.120280100.370030045)

DECLARE @Main_ITEM_CODE VARCHAR(50) = '220080392',
        @pPLANT_CODE VARCHAR(10) = '1';

WITH BOM_CTE
AS (
   -- 锚点:主件的直接子件
   SELECT b.ITEM_ID AS Main_Item_ID,
          i_main.ITEM_CODE AS Main_Item_Code,
          i_main.ITEM_NAME AS Main_Item_Name,
          d.SOURCE_ID_ROid AS Child_Item_ID,
          i_child.ITEM_CODE AS Child_Item_Code,
          i_child.ITEM_NAME AS Child_Item_Name,
          d.QTY_PER AS Qty_Per,
          CAST(d.QTY_PER AS DECIMAL(16, 6)) AS Cumulative_Qty, -- 直接子件的累计组成用量等于其直接用量
          d.EFFECTIVE_DATE AS Effective_Date,
          d.EXPRITY_DATE AS Expiry_Date,
          CAST(i_main.ITEM_CODE + '.' + i_child.ITEM_CODE AS VARCHAR(MAX)) AS Path,
          1 AS Level
   FROM BOM b
       INNER JOIN ITEM i_main
           ON b.ITEM_ID = i_main.ITEM_BUSINESS_ID
       INNER JOIN BOM_D d
           ON b.BOM_ID = d.BOM_ID
       INNER JOIN ITEM i_child
           ON d.SOURCE_ID_ROid = i_child.ITEM_BUSINESS_ID
       INNER JOIN dbo.PLANT AS p
           ON p.PLANT_ID = b.Owner_Org_ROid
   WHERE p.PLANT_CODE = @pPLANT_CODE
         AND i_main.ITEM_CODE = @Main_ITEM_CODE
   UNION ALL

   -- 递归:子件的下阶子件
   SELECT c.Main_Item_ID,
          c.Main_Item_Code,
          c.Main_Item_Name,
          d.SOURCE_ID_ROid AS Child_Item_ID,
          i_child.ITEM_CODE AS Child_Item_Code,
          i_child.ITEM_NAME AS Child_Item_Name,
          d.QTY_PER AS Qty_Per,
          CAST((c.Cumulative_Qty * d.QTY_PER) AS DECIMAL(16, 6)) AS Cumulative_Qty, -- 累计组成用量 = 父累计用量 × 当前直接用量
          d.EFFECTIVE_DATE AS Effective_Date,
          d.EXPRITY_DATE AS Expiry_Date,
          CAST(c.Path + '.' + i_child.ITEM_CODE AS VARCHAR(MAX)) AS Path,
          c.Level + 1 AS Level
   FROM BOM_CTE c
       INNER JOIN BOM b
           ON c.Child_Item_ID = b.ITEM_ID
       INNER JOIN dbo.PLANT AS p
           ON p.PLANT_ID = b.Owner_Org_ROid
       INNER JOIN BOM_D d
           ON b.BOM_ID = d.BOM_ID
       INNER JOIN ITEM i_child
           ON d.SOURCE_ID_ROid = i_child.ITEM_BUSINESS_ID
   WHERE p.PLANT_CODE = @pPLANT_CODE)
SELECT BOM_CTE.Main_Item_ID 主品号ID,
       Main_Item_Code AS 主件品号,
       Main_Item_Name AS 主件品名,
       BOM_CTE.Child_Item_ID 子品号ID,
       Child_Item_Code AS 子品号,
       Child_Item_Name AS 子品名,
       Qty_Per AS 组成用量,
       Cumulative_Qty AS 累计组成用量,
       Effective_Date AS 生效时间,
       Expiry_Date AS 失效时间,
       Path AS 层级关系
FROM BOM_CTE
--WHERE Child_Item_Code = '130060149'
ORDER BY Path
OPTION (MAXRECURSION 20);
-- 注意:如果BOM层级过深或存在循环,可添加 OPTION (MAXRECURSION N) 控制递归深度