使用分层查询生成BOM

时间:2012-12-14 11:13:49

标签: sql sql-server recursion hierarchy sql-server-2012

我有Microsoft SQL Server 2012,并且有一个表格,其中包含有关BOM(物料清单)的所有信息。数据采用以下格式:

Item   | SubItem  | Quantity
item_1 | item_2   | 2
item_1 | item_3   | 3
item_1 | item_4   | 2
item_2 | item_5   | 2
item_2 | item_6   | 2

依旧......

因此,如果我想要10件item_1,则必须将所有商品和商品子商品数量乘以此乘数。我想用查询来实现这种结果:

item_1 - 10pcs - 1 lvl
  item_2 - 20pcs - 2 lvl
    item_5 - 40pcs - 3 lvl
    item_6 - 40pcs - 3 lvl 
  item_3 - 30pcs - 2 lvl
  item_4 - 20pcs - 2 lvl

有关如何以良好方式实现这一目标的任何提示?如果这不可能与查询有关,那么我的另一个选择是在Excel的VBA中完成所有技巧。

1 个答案:

答案 0 :(得分:1)

这可以通过递归查询来完成。这是让你入门的东西:

with all_item_counts as (
select item, subitem, quantity as q, 0 as level from bom
union all 
select all_item_counts.item, bom.subitem, quantity * q, level + 1 
    from all_item_counts
    join bom on bom.item = all_item_counts.subitem
)
select item,subitem,sum(q) from all_item_counts
   group by item, subitem
   order by item, subitem

查询结果是制作特定subItem所需的每个item的总数。

您可以在an SQLFiddle here中看到它正常工作。我在您的示例数据中添加了一些内容,以显示更复杂的案例。