JCB: MS SQL 2005: SUM-Funktion und "geJOINte" Tabellen

Schönen guten Morgen!

Ich fall gleich mal mit der Tür ins Haus. Also ich hab drei Tabellen, welche ich über folgende Abfrage verknüpfe:

SELECT
          TAB_1.ObjektID    AS ObjektID,
          SUM(TAB_2.Anzahl) AS AnzahlGesamt

FROM      TAB_1
LEFT JOIN TAB_2 ON TAB_2.ParentID = TAB_1.ObjektID
LEFT JOIN TAB_3 ON TAB_3.ParentID = TAB_2.ObjektID
GROUP BY TAB_1.ObjektID

Er soll hierbei entsprechenden Childdatensätze zu den In TAB_1 befindlichen Objekten JOINEN und TAB_2.Anzahl summieren und nach dem jeweiligen TAB_1-Objekt gruppieren. Soweit so gut. Das funktioniert aber nur solange, wie ich TAB_3 nicht joine. Denn binde ich diese Tabelle (wie oben) ein, nimmt er TAB_2.Anzahl mal der Anzahl der Childdatensätze in TAB_3 und summiert dann das Produkt. Als Abfrage formuliert, wäre dies quasi "SUM(TAB_2.Anzahl * COUNT(TAB_3.ObjektID))" (ob das jetzt so funzt sei jetzt mal dahingestellt).

Frage: wie kann ich TAB_3 joinen, ohne dass er falsch summiert. TAB_3 brauche ich nämlich noch für andere Berechungen (hab ich hier jetzt mal wegelassen).

Gruß
Jan

  1. Hallo,

    Er soll hierbei entsprechenden Childdatensätze zu den In TAB_1 befindlichen Objekten JOINEN und TAB_2.Anzahl summieren und nach dem jeweiligen TAB_1-Objekt gruppieren. Soweit so gut. Das funktioniert aber nur solange, wie ich TAB_3 nicht joine. Denn binde ich diese Tabelle (wie oben) ein, nimmt er TAB_2.Anzahl mal der Anzahl der Childdatensätze in TAB_3 und summiert dann das Produkt.

    verwende Subselects. Wie dies in Deinem speziellen Fall aussieht, ist von Deinen Tabellen abhängig. Ohne genauere Angaben kann man Dir nicht weiterhelfen.

    Beispieltabellen (aufs nötigste reduziert) mit ein paar Beispieldatensätze und das gewünschte Resultat mit der Begründung, warum dies das Resultat ist, wären hilfreich.

    Freundliche Grüße

    Vinzenz

    1. Hi!

      verwende Subselects. Wie dies in Deinem speziellen Fall aussieht, ist von Deinen Tabellen abhängig. Ohne genauere Angaben kann man Dir nicht weiterhelfen.

      Beispieltabellen (aufs nötigste reduziert) mit ein paar Beispieldatensätze und das gewünschte Resultat mit der Begründung, warum dies das Resultat ist, wären hilfreich.

      Nur Unterabfragen innerhalb der SUM-Funktion (Aggregatfunktion) gehen leider nicht.

      Ok, hier ein paar Beispieldatensätze. TAB_2 ist über die ParentID mit TAB_1 und TAB_3 ist ebenfalls über die ParentID mit TAB_2 verknüpft. TAB_3 hat also keine direkte Relation zu TAB_1.

      TAB_1:
      ObjektID  Beschreibung
      1         Hund
      2         Katze
      3         Maus

      TAB_2:
      ObjektID   ParentID   Anzahl
      1          1          1
      2          1          2
      3          2          3
      4          3          4

      TAB_3:
      ObjektID   ParentID   WertK
      1          1          55
      2          1          0
      3          2          4.3
      4          2          33
      5          2          0
      6          3          0
      7          4          0
      8          4          0

      So, wenn ich jetzt TAB_3 erstmal außer acht lasse und mit meiner Abfrage gruppiert nach TAB_1 TAB_2.Anzahl summiere, dann erhalte ich z.B. für TAB_1.ObjektID = 1 (Hund) als Summe 3. Vollkommen korrekt. JOINe ich TAB_3, erhalte ich 8 als Summe. Also quasi die Summe von dem Produkt TAB_2.Anzahl*COUNT(TAB_3.ObjektID). Und TAB_3 brauch ich, um u.a. die Summe der Spalte "WertK" für die Objekte in TAB_1 zu berechnen. Für Hund wäre dies dann grob ausgedrückt SUM(WertK) -> 92,3.

      Gruß
      Jan

  2. Morgen,

    verwende SUM(Feld) OVER (PARTITION BY GroupFeld,  GroupFeld, ...), dann brauchst du so gesehen auch nicht mehr gruppieren.

    Oder ansonsten verwende CTEs (Common Table Expressions).

    Gruss, Frank