2017-11-20 1 views
1

Ich habe ein Szenario, wo ich prozentualen Anteil von jedem Kindknoten durch Multiplizieren Knotenwert mit Knotengewicht finden muss, (zB NodeVal * (NodeWeight/100)), dann summiere diese berechneten Werte aller Kindknoten und füge sie zu ihrem Elternteil hinzu, jetzt hat dieses neu berechnete Elternteil auf einer Ebene auch sein Gewicht, welches mit seinem Wert und dann wir multipliziert wird Berechnet die Summe aller untergeordneten Knoten auf dieser Ebene und fügt sie der übergeordneten übergeordneten Ebene usw. hinzu.How to Multiple Node Gewicht mit seinem Wert dann compute Summe aller Kindknoten in Eltern Kind Hierarchie mit SQL Server 2008

Abfragen im Internet funktionieren gut, wenn wir einfach die Summe aller Kindknoten berechnen, aber in meinem Fall nicht hilfreich.

Ich verwende folgende Abfrage, aber es liefert kein genaues Ergebnis.

CREATE TABLE TEMP(
     Id INT 
     ,ParentNodeId INT 
     ,Weight FLOAT 
     ,Score FLOAT  
    ); 

     INSERT INTO TEMP 
      VALUES (2, 1, 0, 0), 
      (3, 2, 100, 0), 
      (4, 2, 100, 0), 
      (5, 2, 100, 0), 
      (6, 3, 40, 100), 
      (7, 3, 30, 0), 
      (8, 3, 30, 100), 
      (9, 7, 10, 100), 
      (10, 7, 40, 100), 
      (11, 7, 50, 0), 
      (12, 11, 30, 100), 
      (13, 11, 70, 0), 
      (14, 13, 50, 100), 
      (15, 13, 50, 100); 


WITH cte(Id, ParentNodeId, LEVEL, Struc, Weight, Score) 
      AS 
      (
      SELECT t.Id, t.ParentNodeId, 0 AS LEVEL, CAST(':' + CAST(t.Id AS VARCHAR) + ':' AS VARCHAR(MAX)) AS Struc, t.Weight, t.Score 
      FROM TEMP t 
      WHERE t.ParentNodeId = 2 
      UNION ALL 
      SELECT t.Id, t.ParentNodeId, LEVEL + 1 AS LEVEL, CAST(e.Struc + CAST(t.Id AS VARCHAR) + ':' AS VARCHAR(MAX)) AS Struc, t.Weight, t.Score 
      FROM TEMP t 
      INNER JOIN cte e ON e.Id = t.ParentNodeId   
      ) 

select c1.Id, c1.ParentnodeId, c1.weight, c1.score,c1.struc, 
SUM(c2.score * (c2.weight/100)) ProductCountIncludingChildren 
from cte c1 
left outer join cte c2 on c1.struc <> c2.struc and left(c2.struc, LEN(c1.struc)) = c1.struc 
group by c1.Id, c1.ParentnodeId, c1.weight, c1.score, c1.struc 
order by c1.Id 

Diese Abfrage funktioniert nur bei Abwesenheitsknoten, aber nicht bei höheren Ebenen. SQL Fiddle Link.

Bitte lassen Sie mich wissen, wie dies gelöst werden kann. Vielen Dank für die Hilfe im Voraus - :)

+0

Danke für die Beispieldaten suchen. Kannst du auch die gewünschten Ergebnisse einbeziehen? –

+0

gewünschte Ausgabe als Antwort hinzugefügt, wie ich meine Frage nicht bearbeiten kann, überprüfen Sie bitte. –

Antwort

0

Ich bin nicht in der Lage, meine Frage zu bearbeiten, so dass ich bin gewünschte Ausgabe als Antwort hinzu:

Id P_Id weight score ChildSum 
3 2  100 0 100 
4 2  100 0 (null) 
5 2  100 0 (null) 
6 3  40  100 (null) 
7 3  30  0 100 
8 3  30  100 (null) 
9 7  10  100 (null) 
10 7  40  100 (null) 
11 7  50  0 100 
12 11  30  100 (null) 
13 11  70  0 100 
14 13  50  100 (null) 
15 13  50  100 (null) 

Compute Summe wie folgt aus: childSum für Id 13 wird ([score von ID 14] * ([Gewicht von ID 14]/100)) plus ([Bewertung von ID 15] * ([Gewicht von ID 15]/100)) = >>> (100 * (50/100)) + (100 * (50/100)) => 100

und so weiter.

0

Sie könnten CTE verwenden, aber ich entschied mich für eine linke Verknüpfung.

  Select ID as ID, 
        ParentNodeId as P_ID, 
        Weight as Weight, 
        Score as Score, 
        isnull(Sums,0) as ChildSum 
      From #TEMP 
      Left Join (Select ParentNodeId as P_ID, 
           isnull(Sum(Score*(Weight/100.0)),0) as Sums 
         from #TEMP 
         group by ParentNodeId 
         ) as ParSum on P_ID=ID 

Hoffentlich, was Sie für

+0

Dies berechnet nicht die Summe aller untergeordneten Elemente des übergeordneten Elements, wenn das untergeordnete Element auch als übergeordnetes Element vorhanden ist. –

+0

Ich habe doppelt überprüft und es scheint großartig zu funktionieren. Vielleicht überprüfen Sie einfach Ihre Ausgabe? Für ID = 3 besagt Ihre Formel, dass das Ergebnis 100 * (40/100) + 0 * (30/100) + 100 * (30/100) = 70 <> 100 sein sollte, wie in Ihrer Ausgabe angegeben. Entschuldigung, wenn ich die Frage falsch verstehe. Beachten Sie auch in meiner Ausgabe, ChildSum gibt die Summe für ID nicht P_ID – Stefan

+0

Bitte überprüfen Sie meine gewünschte Ausgabe erneut. Jetzt sehen wir, dass die Knoten-ID 13 die Eltern der beiden Knoten 14 und 15 ist. Also berechnen wir den Punktwert des Knotens 13 unter Verwendung der Formel ([Score von ID 14] * ([Gewicht von ID 14]/100)) plus ([Score von ID 15] * ([Gewicht von ID 15]/100)), also haben wir zu diesem Zeitpunkt einen Wert von 13 berechnet. Wenn wir nicht sehen, dass Knoten 11 Eltern der beiden Knoten 12 und 13 ist, berechnen wir die Punktzahl des Knotens 11 anhand der Formel ([Bewertung von ID 12] * ([Gewicht von ID 12]/100)) plus ([Bewertung von ID 13, kürzlich im vorherigen Schritt berechnet] * ([Gewicht von ID 13]/100)). Bitte lassen Sie mich wissen, wenn Sie meinen Standpunkt verstanden haben, sonst werde ich versuchen, es noch einmal zu erklären –

Verwandte Themen