查找顶级父级和乘法数量

时间:2017-03-13 11:00:32

标签: sql sql-server

我有两个表跟踪零件编号以及装配体的层次结构。

表:配置

ConfigNum  AssemblyNum  Qty
 1            A        1
 1            B        2
 1            C        2
 2            A        1
 2            C        1

表:SubAssembly

 SubAssembly  PartNum  Qty
 A          AA     2
 A          BB     4
 A          CC     2
 A          DD     4
 B          EE     4
 B          FF     8
 AA         AAA    2

我想创建这些表的平面版本,其中显示了ConfigNum(顶级父级)以及Config表中每个ConfigNum的所有关联程序集和部件号。列Config.AssemblyNum相当于SubAssembly.SubAssembly

1 个答案:

答案 0 :(得分:0)

对于这个问题,我认为你必须使用递归查询。事实上,我认为SubAssembly表应该有一些除SubAssembly之外的ProductID字段,以便轻松识别包含程序集的主要产品。

您可以在SLQ Server文档中找到类似的示例。

可在此处查看:http://rextester.com/FQYI80157

更改Config表中的数量以更改最终结果。

create table #t1 (cfg int, part varchar(10), qty int);
create table #t2 (part varchar(10), sasm varchar(10), qty int);
insert into #t1 values (1,'A',2);
insert into #t2 values ('AA','AAA',2),('A','AA',2),('A','BB',4),('A','CC',2),('A','DD',4);

WITH cte(sasm, part, qty) 
AS (
    SELECT sasm, part, qty 
    FROM #t2 WHERE part = 'A'

    UNION ALL

    SELECT p.sasm, p.part, p.qty * pr.qty
    FROM cte pr, #t2 p
    WHERE p.part = pr.sasm
  )
SELECT #t1.cfg, cte.part, cte.sasm, SUM(cte.qty * COALESCE(#t1.qty,1)) as total_quantity
FROM cte
left join #t1 on cte.part = #t1.part
GROUP BY #t1.cfg, cte.part, cte.sasm;

结果如下:

+---+------+------+------+----------------+
|   | cfg  | part | sasm | total_quantity |
+---+------+------+------+----------------+
| 1 | NULL | AA   | AAA  |              4 |
| 2 | 1    | A    | AA   |              4 |
| 3 | 1    | A    | BB   |              8 |
| 4 | 1    | A    | CC   |              4 |
| 5 | 1    | A    | DD   |              8 |
+---+------+------+------+----------------+