Hier ist ein Assemblybaum, den ich mithilfe einer rekursiven T-SQL
Abfrage (vermutlich CTE
) mit den erwarteten Ergebnissen unten durchsuchen möchte . Ich möchte den Gesamtbetrag pro Baugruppe für ein Teil erfahren.
Das heißt, wenn ich nach "Rivet" suche, möchte ich die Gesamtzahl auf jeder Ebene in der Baugruppe wissen, nicht nur die Anzahl der direkten Kinder.
Assembly (id:1)
|
|-Rivet
|-Rivet
|-SubAssembly (id:2)
| |
| |-Rivet
| |-Bolt
| |-Bolt
| |-SubSubAssembly (id:3)
| |
| |-Rivet
| |-Rivet
|
|-SubAssembly (id:4)
|-Rivet
|-Bolt
DESIRED Results
-------
ID, Count
1 , 6
2 , 3
3 , 2
4 , 1
Derzeit kann ich die direkten Eltern erreichen, möchte aber wissen, wie ich meinen CTE erweitern kann, damit ich diese Informationen nach oben rollen kann.
With DirectParents AS(
--initialization
Select InstanceID, ParentID
From Instances i
Where i.Part = 'Rivet'
UNION ALL
--recursive execution
Select i.InstanceID, i.ParentID
From PartInstances i INNER JOIN DirectParents p
on i.ParentID = p.InstanceID
)
select ParentID, Count(instanceid) as Totals
from DirectParents
group by InstanceID, ParentID
Results
-------
ID, Count
1 , 2
2 , 2
3 , 2
4 , 1
Erstellungsskript
CREATE TABLE [dbo].[Instances] (
[InstanceID] NVARCHAR (50) NOT NULL,
[Part] NVARCHAR (50) NOT NULL,
[ParentID] NVARCHAR (50) NOT NULL, );
INSERT INTO Instances
Values
(1, 'Assembly', 0),
(50, 'Rivet', 1),
(50, 'Rivet', 1),
(2, 'SubAssembly', 1),
(50, 'Rivet', 2),
(51, 'Bolt', 2),
(51, 'Bolt', 2),
(3, 'SubSubAssembly', 2),
(50, 'Rivet', 3),
(50, 'Rivet', 3),
(4, 'SubAssembly2', 1),
(50, 'Rivet', 4),
(51, 'Bolt', 4)
quelle
Ich bin nicht sicher, ob ich verstehe, was Sie unter "Betrag" verstehen und woher die Tabelle (?) PartInstances und Spalten id und count in Ihrer Stichprobe stammen, aber ich habe berechnet, was ich aus Ihren Stichprobendaten erraten habe.
Ich hoffe, das wird Ihnen einige Ideen geben.
Aktualisieren
Ich verstehe, dass dies ein Testbeispiel ist, aber Ihre Daten brechen alles ab
1NF
. Höchstwahrscheinlich sollte Ihr Tisch in zwei Teile geteilt und normalisiert werden.quelle