Abfrage: Eine Spalte gruppieren und die andere entsprechend der Gruppierung summieren

  • VB.NET
  • .NET 4.0

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Counterbug.

    Abfrage: Eine Spalte gruppieren und die andere entsprechend der Gruppierung summieren

    Guten Morgen!

    Ich habe ein Problem bei einer ganz simplen Abfrage, welche aus zwei Tabellen lediglich zwei Werte ausgeben soll: Die ID aus Tabelle1 und die Summe der zugeordneten Beträge in Tabelle2 (1:n verbunden). Gruppiert soll nach der ID werden, so dass folgendes entsteht:

    TB1:
    ID
    1
    2
    3
    4

    TB2
    ID | Wert
    1 | 5
    1 | 6
    1 | 7
    1 | NULL
    2 | 8
    4 | 2
    4 | 6


    ABFRAGE (= gewünschtes Ergebnis):
    ID | Summe(Wert)
    1 | 18
    2 | 8
    3 | 0
    4 | 8


    Mein aktueller (fehlerhafter) SQL-String dazu:

    SQL-Abfrage

    1. SELECT t_010_COIAs.ID,
    2. Sum(t_009_Auftraege.KostenPaletten) AS SummevonKostenPaletten,
    3. Sum(t_009_Auftraege.KostenRuestHandl) AS SummevonKostenRuestHandl
    4. FROM t_010_COIAs INNER JOIN t_009_Auftraege
    5. ON t_010_COIAs.ID = t_009_Auftraege.t_010_COIAs_ID
    6. GROUP BY t_010_COIAs.ID


    Einfaches Problem hierbei: Die Summen sind nicht korrekt! Wenn man die Summenfelder nicht summiert sondern gruppiert, werden alle Werte korrekt (untereinander) angezeigt. Was ist dabei mein Denkfehler?
    Alle mit Group-By (korrekte Werte werden angezeigt, aber nicht summiert):



    ID gruppiert, Summenfelder summiert (korrekt gruppiert, allerdings sind Summen nicht korrekt):
    hier: ID 180 korrekt, ID 188 komplett falsch, ID 287 wieder korrekt...


    Da ich leider mit MS Access 2013 arbeite (-n muss) funktioniert leider eine komplette Gruppierung nicht, da jedes Feld nur entweder summiert oder gruppiert werden kann...
    Was steht denn in der Tabelle wirklich drin.
    Sieht für mich doch soweit nicht verkehrt aus.
    Ich tippe auf:
    180|0|160
    180|0|0
    180|43|160
    180|129|160
    188|0|160
    188|43|160
    188|43|160
    188|43|160
    188|43|160
    188|43|160
    188|43|160
    188|43|160
    188|43|160
    188|43|160
    287|172|160
    287|3913|160

    Summiert:
    180|172|480
    188|387|1600
    287|4085|320

    alles richtig...

    Wenn du nach ALLEM gruppierst und nicht summierst... dann zeigt er jede Kombination nur einmal an und das erklärt auch deine Gruppierungs-Anzeige.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MemoAnMichSelbst“ ()

    So funktionierts:

    SQL-Abfrage

    1. SELECT Name , SUM(tblT2.Wert)
    2. FROM tblT2
    3. INNER JOIN dbo.tblT1 ON tblT2.FK_T1 = tblT1.IDT1
    4. GROUP BY Name


    Resultat:


    Du musst dein Join umkehren.

    Select Name,Sum(Wert)
    FROM TabelleMitWerten
    INNER JOIN TabelleMitNamen

    EDIT:://

    SQL-Abfrage

    1. SELECT t_010_COIAs.ID,
    2. Sum(t_009_Auftraege.KostenPaletten) AS SummevonKostenPaletten,
    3. Sum(t_009_Auftraege.KostenRuestHandl) AS SummevonKostenRuestHandl
    4. FROM t_009_Auftraege INNER JOIN t_010_COIAs
    5. ON t_010_COIAs.ID = t_009_Auftraege.t_010_COIAs_ID
    6. GROUP BY t_010_COIAs.ID

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lingo“ ()

    Oder möchtest du beide "Kosten" zusammen summieren?

    Dann wäre es:
    SELECT Tabelle1.ID, Sum([KostenPlatten]+[KostenRues]) AS Kosten
    FROM Tabelle1
    GROUP BY Tabelle1.ID;

    EDIT:
    Auf dein Beispiel gemünzt:
    SELECT t_010_COIAs.ID,
    Sum([t_009_Auftraege].[KostenPaletten] + [t_009_Auftraege.KostenRuestHandl]) AS SummevonKosten
    FROM t_010_COIAs INNER JOIN t_009_Auftraege
    ON t_010_COIAs.ID = t_009_Auftraege.t_010_COIAs_ID
    GROUP BY t_010_COIAs.ID


    Also vom Prinziep her.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „MemoAnMichSelbst“ ()

    Lasst doch erstmal warten was der TE nun eigentlich möchte als hier zu raten...

    PS: Nen Inner Join sollte keine Null-Werte aus einer gejointen Tabelle anzeigen, da der Sinn des Inner Join ja ist, nur Datensätze zu zeigen die in beiden Tabellen vorkommen!
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    @ MemoAnMichSelbst
    - Gupierst du aber entsprechend werden auch NULL-Werte angezeigt.

    Probier es selber aus:

    SQL-Abfrage

    1. SELECT Name , SUM(tblT2.Wert)
    2. FROM tblT2
    3. INNER JOIN dbo.tblT1 ON tblT2.FK_T1 = tblT1.IDT1
    4. GROUP BY Name
    Definitiv nicht:

    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    @Lingo

    Es geht hier auch nicht um Null-Werte von irgendwelchen Werte-Spalten, sondern um Schlüssel.

    In dem Beispiel
    TB1:
    ID
    1
    2
    3
    4

    TB2
    ID | Wert
    1 | 5
    1 | 6
    1 | 7
    1 | NULL
    2 | 8
    4 | 2
    4 | 6

    hat TB2 nunmal keinen Datensatz mit ID 3, und deshalb wird dir der Inner Join auch keine Row mit ID 3 zurückgeben. Beim Left Join wird jede ID aus TB1 zurückgegeben, egal ob sie in TB2 zu finden ist oder nicht.