SQL Query mit Join, aufsummieren aber vorher negative Werte bestimmen
Hallo zusammen,
leider fällt es mir etwas schwer mein Problem kurz und knapp im Titel zu beschreiben.
Gegeben seien folgende 2 Tabellen:
Tabelle: Auftrag
Tabelle: RechnungGutschrift
Wenn ich nun die beiden Tabellen Joine und mir nur den Auftrag '123456' anzeigen lasse, erhalte ich folgendes Ergebnis:
Soweit schön und gut. Allerdings möchte ich nur eine Zeile pro Projekt zurück gegeben bekommen. Und zwar sollen die Rechnungsbeträge einfach aufsummiert werden. Im Prinzip ja einfach zu machen mit 'OUTER APPLY' und 'GROUP BY' und 'SUM(betrag)'. Das Problem ist jetzt das man die Beträge nicht einfach aufsummieren kann sondern berücksichtigen muss das auch Gutschriften in der Tabelle eingetragen sind. Also müsste man zuerst bei der Zeile wo 'art' = 'g' den 'betrag' negieren.
Wie kann ich also nun die Tabelle 'rechnunggutschrift' so dazu joinen das ich nur eine Zeile bekomme in der alle Werte aus 'betrag' addiert wurden aber berücksichtig wird das Zeilen mit 'art' = 'g' negativ sind, obwohl dort kein Vorzeichen eingetragen ist?
Das Ergebnis müsste ja so aussehen:
Würde mich sehr freuen wenn mich einer auf die richtige Spur setzt!
leider fällt es mir etwas schwer mein Problem kurz und knapp im Titel zu beschreiben.
Gegeben seien folgende 2 Tabellen:
Tabelle: Auftrag
|-----------|-------|--------|----------|
|AuftragsID | Kunde | Blabla | Blubblub |
|-----------|-------|--------|----------|
|123456 | 134 | Text | Text |
|123457 | 134 | Text | Text |
|123458 | 134 | Text | Text |
|123459 | 134 | Text | Text |
|-----------|-------|--------|----------|
Tabelle: RechnungGutschrift
|-----------|--------|------------|--------|----|
|AuftragsID | Betrag | Datum | Nummer | Art|
|-----------|--------|------------|--------|----|
|123456 | 30500 | 01.01.2014 | 56781 | RE |
|123456 | 24500 | 01.01.2014 | 56782 | RE |
|123456 | 5000 | 01.01.2014 | 56783 | RE |
|123456 | 1000 | 01.01.2014 | 56784 | G |
|123457 | 4380 | 01.01.2014 | 56782 | RE |
|123458 | 25460 | 01.01.2014 | 54323 | RE |
|123459 | 19870 | 01.01.2014 | 65634 | RE |
|-----------|--------|------------|--------|----|
Wenn ich nun die beiden Tabellen Joine und mir nur den Auftrag '123456' anzeigen lasse, erhalte ich folgendes Ergebnis:
SELECT * FROM auftrag LEFT JOIN rechnunggutschrift ON auftrag.auftragsid = rechnunggutschrift.auftragsid WHERE auftrag.auftragsid = '123456'
|-----------|-------|--------|----------||-----------|--------|------------|--------|----|
|AuftragsID | Kunde | Blabla | Blubblub ||AuftragsID | Betrag | Datum | Nummer | Art|
|-----------|-------|--------|----------||-----------|--------|------------|--------|----|
|123456 | 134 | Text | Text ||123456 | 30500 | 01.01.2014 | 56781 | RE |
|123456 | 134 | Text | Text ||123456 | 24500 | 01.01.2014 | 56782 | RE |
|123456 | 134 | Text | Text ||123456 | 5000 | 01.01.2014 | 56783 | RE |
|123456 | 134 | Text | Text ||123456 | 1000 | 01.01.2014 | 56784 | G |
|-----------|-------|--------|----------||-----------|--------|------------|--------|----|
Soweit schön und gut. Allerdings möchte ich nur eine Zeile pro Projekt zurück gegeben bekommen. Und zwar sollen die Rechnungsbeträge einfach aufsummiert werden. Im Prinzip ja einfach zu machen mit 'OUTER APPLY' und 'GROUP BY' und 'SUM(betrag)'. Das Problem ist jetzt das man die Beträge nicht einfach aufsummieren kann sondern berücksichtigen muss das auch Gutschriften in der Tabelle eingetragen sind. Also müsste man zuerst bei der Zeile wo 'art' = 'g' den 'betrag' negieren.
Wie kann ich also nun die Tabelle 'rechnunggutschrift' so dazu joinen das ich nur eine Zeile bekomme in der alle Werte aus 'betrag' addiert wurden aber berücksichtig wird das Zeilen mit 'art' = 'g' negativ sind, obwohl dort kein Vorzeichen eingetragen ist?
Das Ergebnis müsste ja so aussehen:
|-----------|-------|--------|----------||--------|
|AuftragsID | Kunde | Blabla | Blubblub || Betrag |
|-----------|-------|--------|----------||--------|
|123456 | 134 | Text | Text || 59000 |
|-----------|-------|--------|----------||--------|
Würde mich sehr freuen wenn mich einer auf die richtige Spur setzt!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 228435
Url: https://administrator.de/forum/sql-query-mit-join-aufsummieren-aber-vorher-negative-werte-bestimmen-228435.html
Ausgedruckt am: 23.12.2024 um 12:12 Uhr
3 Kommentare
Neuester Kommentar
Hallo cmeese,
könnte man mit zwei SUB-SELECTS lösen welche die Summen für die Rechnungen und Gutschriften bildet, und die Gutsschriftsumme dann von den Rechnungen abzieht:
Grüße Uwe
könnte man mit zwei SUB-SELECTS lösen welche die Summen für die Rechnungen und Gutschriften bildet, und die Gutsschriftsumme dann von den Rechnungen abzieht:
SELECT a.AuftragsID, a.Kunde, a.BlaBla, a.Blubblub, (
SELECT SUM(r.Betrag)
FROM RechnungGutschrift r
WHERE r.AuftragsID = a.AuftragsID AND r.Art = 'RE'
)-(
SELECT SUM(r.Betrag)
FROM RechnungGutschrift r
WHERE r.AuftragsID = a.AuftragsID AND r.Art = 'G'
) AS Betrag
FROM Auftrag a
WHERE a.AuftragsID = '123456'
Moin cmeese und colinardo,
würde es nicht auch mit einem Subselect reichen?
Grüße
Biber
würde es nicht auch mit einem Subselect reichen?
SELECT a.AuftragsID, a.Kunde, a.BlaBla, a.Blubblub
, ( SELECT SUM( Case r.Art
When 'RE', r.Betrag
when 'G', -r.Betrag
else 0 END )
FROM RechnungGutschrift r
WHERE r.AuftragsID = a.AuftragsID
) AS Betrag
FROM Auftrag a
WHERE a.AuftragsID = '123456'
Grüße
Biber