SQL-Abfrage: Wert einer Spalte mit bestimmtem Wert in einer Zeile einer anderen Spalte

MacFlo

Neuer Benutzer
Beiträge
1
Hallo zusammen, ich bin SQL-Neuling und komme gerade bei einem Problem nicht weiter.

Ich möchte Daten aus zwei Tabellen abfragen.

In der ersten Tabelle gibt es für jede ID (Rechnungsnummer) genau eine Zeile:

Tabelle Rechnung
Rechnungsnummer | Bruttorechnungsbetrag
100000 | 119
100001 | 200

Die ID 'Rechnungsnummer' gibt es auch in der zweiten Tabelle.
Für eine Rechnungsnummer gibt es in dieser Tabelle aber mehrere Zeilen.
Die Zeile mit dem Wert '2' in der Spalte 'Buchungstyp' gibt es aber nicht für jede Rechnungsnummer (nicht bei jeder Rechnung wird die Mwst berechnet):

Tabelle Journal
Rechnungsnummer | Buchungstyp | Buchungstext | Betrag
1000000 | 1 | Position A | 60
1000000 | 1 | Position B | 40
1000000 | 2 | Mwst | 19
1000001 | 1 | Position C | 90
1000001 | 1 | Position D | 110

Meine benötigte Ergebnistabelle soll für jede Rechnungsnummer genau eine Zeile haben.
Die Spalten sollen die 'Rechnungsnummer' und den 'Bruttorechnungsbetrag' aus der Tabelle 'Rechnung' enthalten und den 'Betrag' der Mwst (= 'Buchungstyp = 2') aus der Tabelle 'Journal'.
Aus dem Bruttorechnungsbetrag und dem Betrag der Mwst soll der Nettorechnungsbetrag berechnet werden.
Wenn es für eine Rechnungsnummer keine Zeile für die Mwst gibt, soll in der Ergebnistabelle in der Spalte Mwst eine '0' stehen:

Ergebnistabelle
Rechnungsnummer | Nettorechnungsbetrag | Mwst | Bruttorechnungsbetrag
100000 | 100 | 19 | 119
100001 | 200 | 0 | 200

Mit einem "normalem" JOIN der beiden Tabellen über die Rechnungsnummer komme ich nicht weiter, da ich dann in der Ergebnistabelle mehrere Zeilen pro Rechnungsnummer bekomme.
Mit einem
FROM Rechnung R JOIN Journal J ON R.Rechnungsnummer=J.Rechnungsnummer AND J.Buchungstyp=2
klappt es aber auch nicht, da dann die Rechnungen ohne Mwst rausfallen.

Ich habe auch schon versucht über 'CASE WHEN THEN ELSE END' weiterzukommen, das war bisher aber leider auch nicht von Erfolg gekrönt.

Über Hinweise zur Lösung meines Problems würde ich mich sehr freuen.

Vielen Dank!
Flo
 
Werbung:
hilft dir das weiter?

Code:
postgres=# select * from journal ;
 rechnung | typ | betrag 
----------+-----+--------
        1 |   1 |     60
        1 |   1 |     40
        1 |   2 |     19
        2 |   1 |     90
        2 |   1 |    110
(5 rows)

postgres=# with netto as (select rechnung, sum(betrag) from journal where typ = 1 group by rechnung), mwst as (select rechnung, betrag as mwst from journal where typ=2) select * from netto left join mwst on netto.rechnung=mwst.rechnung;
 rechnung | sum | rechnung | mwst 
----------+-----+----------+------
        1 | 100 |        1 |   19
        2 | 200 |          |     
(2 rows)

Den Rest überlasse ich Dir zur Übung.
 
Werbung:
Mit einem "normalem" JOIN der beiden Tabellen über die Rechnungsnummer komme ich nicht weiter, da ich dann in der Ergebnistabelle mehrere Zeilen pro Rechnungsnummer bekomme.
Mit einem
FROM Rechnung R JOIN Journal J ON R.Rechnungsnummer=J.Rechnungsnummer AND J.Buchungstyp=2
klappt es aber auch nicht, da dann die Rechnungen ohne Mwst rausfallen.
Mir scheint du bist schon ganz allein auf dem richtigen Weg. Nur, dein JOIN impliziert einen INNER JOIN, du suchst aber einen LEFT JOIN.
Code:
FROM Rechnung R LEFT JOIN Journal J ON R.Rechnungsnummer=J.Rechnungsnummer AND J.Buchungstyp=2
Die Spalte Mwst ist dann ggf. NULL. Dafür kannst du bei Bedarf noch isnull(spalte,0) verwenden.

Wenn ich dich richtig verstehe ist eine Aggregation für die Summe gar nicht mehr nötig, wie in dem Code von @akretschmer beschrieben.
 
Zurück
Oben