2017-03-13 11 views
0

部品番号とアセンブリの階層を追跡する2つのテーブルがあります。トップレベルの親を見つけて数量を掛けよう

表:コンフィグ

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

表:サブアセンブリ

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に相当します。

+0

私は、 "サーバー" は "SQLサーバ" を意味することを推測しています。実際に使用しているデータベースで質問にタグを付ける必要があります。 –

答えて

0

この問題では、再帰的なクエリを使用する必要があると思います。実際には、SubAssemblyテーブルには、SubAssembly以外のProductIDフィールドがあり、アセンブリを含む主な製品を簡単に識別できるはずです。

SLQサーバのマニュアルでも同様の例があります。

は、ここでそれを確認することができます:http://rextester.com/FQYI80157

変更コンフィグテーブルの数量は、最終結果を変更します。

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 | 
+---+------+------+------+----------------+ 
関連する問題