車の一部の部品が階層的に関連付けられているテーブルがあり、各行でそれらの部品を製造するコストもあります。これは、テーブルを簡略化したものです。
parentId Id description qty manufacturingCost costDescripcion
-------- --- ----------- --- ----------------- ---------------
NULL 1 Car 1 100 Assembly the car
NULL 2 Motorcycle 1 100 Assembly the motrocycle
1 11 Wheel 4 20 Assembly the wheel
11 111 Rim 1 50 Manufacture the rim
11 112 Tire 1 60 Manufacture the tire
1 12 Door+Window 4 30 Assembly the door and the window
12 121 Door 1 30 Manufacture the door
12 122 Window 2 10 Manufacture the window
2 11 Wheel 2 15 Assembly the wheel
家系図全体を「車」から始めて、各支店の合計数量と合計コストを表示する必要があります。より適切に説明すると、車には4つのホイールがあり、各ホイールには1つのリムと1つのタイヤがあるので、1つの車、4つのホイール、4つのタイヤ、4つのリムを取得する必要があります。コストについてはもう少し複雑です。車の組み立てには100ドルかかりますが、このコストに、4つのホイール(4x20)の組み立てと、4つのリム(4x50)と4つのタイヤの製造コストを追加する必要があります。 (4x60)、そしてドアと窓についても同じです。
これは期待される結果です:
parentId Id description qty manufacturingCost recLevel
-------- --- ----------- --- ----------------- ---------------
NULL 1 Car 1 940 (100+4*130+4*80) 0
1 11 Wheel 4 130 (20+50+60) 1
1 12 Door+Window 4 80 (30+30+2*10) 1
12 121 Door 4 30 2
12 122 Window 8 10 2
11 111 Rim 4 50 2
11 112 Tire 4 60 2
再帰関数またはストアドプロシージャを使用してこれに簡単に到達できますが、より複雑な構造では非常に遅いため、共通テーブル式を使用してこれを実行しようとしています。しかし、私はコストを合計する方法を見つけられませんでした。トップレベルから下に向かって再帰CTEを使用し、数量の合計を取得しますが、構造内で内部から外部に移動してコストを合計する必要があります。どうすればよいですか?
これは、テーブルを作成するためのコードです。
CREATE TABLE #Costs
(
parentId int,
Id int,
description varchar(50),
qty int,
manufacturingCost int,
costDescripcion varchar(150)
)
INSERT INTO #Costs VALUES (NULL , 1, 'Car', 1, 100, 'Assembly the car')
INSERT INTO #Costs VALUES (NULL , 2, 'Motorcycle', 1, 100, 'Assembly the motrocycle')
INSERT INTO #Costs VALUES (1 , 11, 'Wheel', 4, 20, 'Assembly the wheel')
INSERT INTO #Costs VALUES (11 , 111, 'Rim', 1, 50, 'Manufacture the rim')
INSERT INTO #Costs VALUES (11 , 112, 'Tire', 1, 60, 'Manufacture the tire')
INSERT INTO #Costs VALUES (1 , 12, 'Door+Window', 4, 30, 'Assembly the door and the window')
INSERT INTO #Costs VALUES (12 , 121, 'Door', 1, 30, 'Manufacture the door')
INSERT INTO #Costs VALUES (12 , 122, 'Window', 2, 10, 'Manufacture the window')
INSERT INTO #Costs VALUES (2 , 11, 'Wheel', 2, 15, 'Assembly the wheel')
そしてこれは私が書いたCTEです:
with CTE(parentId, id, description, totalQty, manufacturingCost, recLevel)
as
(
select c.parentId, c.id, c.description, c.qty, c.manufacturingCost, 0
from #Costs c
where c.id = 1
union all
select c.parentId, c.id, c.description, c.qty * ct.totalQty, c.manufacturingCost, ct.recLevel + 1
from #Costs c
inner join CTE ct on ct.id = c.parentId
)
select * from CTE
そして、これは私が得た結果です。ご覧のとおり、期待されたものではありません(コストは追加されていません)。
parentId Id description qty manufacturingCost recLevel
-------- --- ----------- --- ----------------- ---------------
NULL 1 Car 1 100 0
1 11 Wheel 4 20 1
1 12 Door+Window 4 30 1
12 121 Door 4 30 2
12 122 Window 8 10 2
11 111 Rim 4 50 2
11 112 Tire 4 60 2
CTEを使用してやりたいことを行うことは可能ですか?もしそうなら、どうすればそれを行うことができますか?
どうもありがとうございます、
アントゥアン