Summe 2er Spalten aus jeweils 1 separaten Tabelle

Scuzzi

Mitglied
Hallo Forum,

Wiedermal stehe ich am Ende meines Latein.

So sollte es aussehen

Wunsch Output
kunden_id Saldo
1 -1
2 8
3 -3
4 19
5 1
6 8

----------------------------------------------------

Die Tabellen

Kunden
kunden_id name
1 kunde 1
2 kunde 2
3 kunde 3
4 kunde 4
5 kunde 5
6 kunde 6
7 kunde 7

Sitzungen
id kunden_id haben
1 1 1
2 1 5
3 2 1
4 3 3
5 3 5
6 6 2
7 5 1
8 4 1
9 2 1
SUM 20

Rechnungen
id kunden_id soll
1 1 5
2 2 10
3 3 5
4 4 20
5 5 2
6 6 10
7 2 5
SUM 57




Hier der Code

SELECT DISTINCT
`kunden`.`name`,
SUM(`rechnungen`.`soll`) - SUM(`sitzungen`.`haben`) AS `Saldo`

FROM
`rechnungen`
INNER JOIN `kunden` ON (`rechnungen`.`kunden_id` = `kunden`.`kunden_id`)
INNER JOIN `sitzungen` ON (`kunden`.`kunden_id` = `sitzungen`.`kunden_id`)

GROUP BY
`kunden`.`name`



daraus resultierender unerwünschter Output

kunden_id Saldo
1 4
2 26
3 2
4 9
5 1
6 8

--------------------------------------------------------------------------------


Ich komme nicht drauf, wo ich den Denkfehler mache!

Könnt Ihr mir helfen?
 
Da die Tabelle sitzungen 2 Zeilen mit ID 1 haben, werdend iese alle mit der einen Zeile der Tabelle Rechnungen zusammengesetzt.
Somit hast du auf der Soll-Seite 2 mal den Wert drin
(2x5) - (1+4) = 6

Du musst die einzelnen Tabellen aggrigieren bevor du sie zusammenfügst

Ein Beispiel für MySQL
SQL:
SELECT
    k.name,
    r.soll - s.haben AS saldo
FROM
    kunden k
    
    /* rechnungen auf kunden_nr zusammenfassen */
    INNER JOIN (
        SELECT      rd.kunden_id, 
                    SUM(rd.soll)    AS soll 
        FROM        rechnungen AS rd
        GROUP BY    rd.kunden_id
    )   AS r 
    ON r.kunden_id = k.kunden_id
    
    /* sitzungen auf kunden_nr zusammenfassen */
    INNER JOIN (
        SELECT      sd.kunden_id, 
                    SUM(sd.haben) AS haben 
        FROM        sitzungen AS sd
        GROUP BY    sd.kunden_id
    ) AS s 
    ON k.kunden_id = s.kunden_id

Nachtrag:
Einfach von der Logik aus habe Kunden als Master-Tabelle genommen.
Wenn du dann noch alle Kunden haben willst, egal ob sie in den 2 Tabellen vorhanden sind oder nicht, kannst du einfach aus dem INNER JOIN jeweils ien LEFT JOIN machen und bei der Saldoberechnung noch jedes Feld mit IFNULL() auf 0 setzen falls keine Zusatzinfos gefunden werden
SQL:
SELECT
    k.name,
    IFNULL(r.soll, 0) - IFNULL(s.haben, 0) AS saldo
FROM
    kunden k
    
    /* rechnungen auf kunden_nr zusammenfassen */
    LEFT JOIN ...
 
Zuletzt bearbeitet von einem Moderator:
Moin Scuzzi,

wieso sollte das Entfernen von DISTINCT hier auch etwas verändern oder gar verbessern?

Ich denke, dass du ERST in den Sitzung und rechnungen nach Kunden_id gruppieren solltest.

DISTINCT wäre (bei anderen Daten) durchaus richtig, da für eine Kunden_ID mehrere Rechnungen da sein können.

Da du als führende Tabelle für deine Abfrage ja die Rechnungen nimmst und die Kunden_id 2 zweimal da ist, kann ich zumindest nachvollziehen, wieso das DISTINCT da mal rein kam.


Ich würde es sinngemäß so machen:
SQL:
SELECT 
 -- r. kunden_id , 
 k.name, r.soll, s.haben, r.soll-s.haben as saldo
FROM 
 ( select kunden_id, sum(soll) as soll 
    from Rechnungen 
    group by kunden_id
  ) r JOIN kunden k ON (r.kunden_id = k.kunden_id)
 left join (
   select kunden_id , sum(haben) as haben  
   from sitzungen 
   group by kunden_id
  ) s ON (r.kunden_id = s.kunden_id)

order by 1

Heraus käme
NAME SOLL HABEN SALDO
kunde 1 5 6 -1
kunde 2 15 2 13
kunde 3 5 8 -3
kunde 4 20 1 19
kunde 5 2 1 1
kunde 6 10 2 8

-> was deiner Zielvorstellung schon recht nahe kommt.

Wieso du "Kunden 2" 8 erwartest laut oben, während ich auf 13 komme, das bleibt zu prüfen.

Ach ja, und das "sinngemäß machen" oben bedeutet: Hmm, ich würde nicht in dem Selct alle Kunden_IDs zusammenschaufeln und am Ende dann alles nur nach Kunden.namen ausgeben. Wenn ich zweimal "Müller" als Kunde habe mit Kunden_id 12 und 24... das kann nur schief gehen bei dieser Saldenrechnung.


Grüße
Biber

[Edit]
Uups, yaslaw, hatte nicht mitbekommen, dass du schon schneller geantwortet hattest.
[/Edit]
 
Zuletzt bearbeitet:
Hallo, kann leider im moment nicht weiter machen. Es klingt alles so logisch wenn ihr das erklärt! Auch der code liest sich logisch! Ich bin ein bisschen frustriert, dass ich dass nicht selber kann! Ich bin schon total neugierig! heute abend implementiere ich das! wie komme ich zu solchen beispielen?
 
Moin scuzzi,

die zwei kleinen Aha-Aussagen bei diesem Statement sollten doch nur sein:

- Ein "Errechne Summenwerte aus drei verjointen Tabellen" ergibt oft etwas anders als ein "Ermittle Werte aus drei verjointen Summentabellen". wenn du das, was yaslaw oben so schön visualisiert hast, mitnehmen kannst -> Tagesziel erreicht.

- Zweitens: es macht schon Unterschiede, von welcher Tabelle aus du anfängst mit dem JOINen.
Ich hatte deine Mimik beibehalten, von der "Rechnungen" auszugehen, obwohl der "fachliche Zusammenhang" auch nach meinem Empfinden über die Kunden.Kunden_id und damit die "Kunden"-Tabelle gegeben ist.

Ein Verjoinen einer Rechnungen.kunden_id mit einer Sitzungen.Kunden_id
->der Zusammenhang ist ja nirgends gewährleistet auf Datenbank-Ebene, sondern basiert auf Unterstellungen. ;-)

Ich denke, zwei gelernte Lektionen sind ein sehr guter Tagesschnitt, also ist doch alles gut.

Grüße
Biber
 
Zurück