Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Join: Datensätze sind mehrfach vorhanden, sollen sie aber nicht (https://www.delphipraxis.net/206809-join-datensaetze-sind-mehrfach-vorhanden-sollen-sie-aber-nicht.html)

BlueStarHH 1. Feb 2021 08:25

Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC

Join: Datensätze sind mehrfach vorhanden, sollen sie aber nicht
 
Ich habe diese Tabellen:

Rechnung
---------
ReNr
Datum
Netto
...

MwSt
--------
ReNr
MwStSatz
MwStBetrag
...

Dabei kann es zu einem Rechnungs-Datensatz beliebig viele Datensätze in der MwSt-Tabelle geben. Da es Rechnungen geben kann, die mehere MwSt-Sätze enthalten.

Ich möchte nun die Netto-Summe und MwSt-Summe aller Rechnungen eines Jahre ausgeben. Das mache ich so:

Code:
select sum(R.Netto), sum(M.MwStBetrag)
from Rechnung R
left join MwSt M on (R.ReNr = M.ReNr)
where Datum >= '2020-01-01' and Datum <= '2020-12-31'
Das Problem ist hier nun, dass die Netto-Summe zu hoch ist, da durch den Join der MwSt-Tabelle einige Netto-Beträge der Rechnung doppelt gezählt werden. Wenn es z.B. 2 MwSt-Sätze gibt, erzeut der Join 2 Result-Datensätz. Dabei addiert sum(R.Netto) denn Nettobetrag der *selben* Rechung zwei mal! sum(M.MwStBetrag) addiert in den zwei Datensätzen die beiden MwStBeträge. Das ist ok.

Wie mache ich das richtig?

mkinzler 1. Feb 2021 08:46

AW: Join: Datensätze sind mehrfach vorhanden, sollen sie aber nicht
 
Nimm den Durchschnitt

SQL-Code:
select
  sum(R.Netto)/count(R.ReNr) as Nett, sum(M.MwStBetrag)/count(R.ReNr) as MwSt
from
  Rechnung R
    left join MwSt M on (M.ReNr = R.ReNr)
where
  Datum >= '2020-01-01' and Datum <= '2020-12-31';

jobo 1. Feb 2021 08:53

AW: Join: Datensätze sind mehrfach vorhanden, sollen sie aber nicht
 
Aber in den Rechnungspositionen muss doch irgenwo enthalten sein, welcher MwSt Satz jeweils verwendet wird. Das sollte doch gezielter zu joinen sein.
Und wenn nicht, wird dieses Problem überall auftauchen, wo Du diese Tabelle dazu joinst.

Jumpy 1. Feb 2021 11:18

AW: Join: Datensätze sind mehrfach vorhanden, sollen sie aber nicht
 
Select R.Netto, sum(M.MwStBetrag) MwStBetrag
From
(select ReNr, sum(Netto) as Netto from Rechnung
where Datum >= '2020-01-01' and Datum <= '2020-12-31'
Group ByReNr
) R
LEFT JOIN
MwSt M on (R.ReNr = M.ReNr)
Group By R.Netto

BlueStarHH 1. Feb 2021 12:39

AW: Join: Datensätze sind mehrfach vorhanden, sollen sie aber nicht
 
Zitat:

Zitat von Jumpy (Beitrag 1481915)
Select R.Netto, sum(M.MwStBetrag) MwStBetrag
From
(select ReNr, sum(Netto) as Netto from Rechnung
where Datum >= '2020-01-01' and Datum <= '2020-12-31'
Group ByReNr
) R
LEFT JOIN
MwSt M on (R.ReNr = M.ReNr)
Group By R.Netto

Danke, das hat mich auf den richtigen Weg gebracht. Musste nur noch die Tabellen Rechnung und MwSt vertauschen, dann passt es. Denn es sind ja in MwSt mehrere Einträge je ReNr vorhanden, die man mit dem subselect zusammenfassen muss.

BlueStarHH 1. Feb 2021 12:42

AW: Join: Datensätze sind mehrfach vorhanden, sollen sie aber nicht
 
Zitat:

Zitat von jobo (Beitrag 1481902)
Aber in den Rechnungspositionen muss doch irgenwo enthalten sein, welcher MwSt Satz jeweils verwendet wird. Das sollte doch gezielter zu joinen sein.
Und wenn nicht, wird dieses Problem überall auftauchen, wo Du diese Tabelle dazu joinst.

Ja, in den Rechnungspositionen ist der MwSt-Satz gespeichert. Das wäre aber noch eine dritte Tabelle, die ich hier nicht verwenden möchte. Es sollen die Gesamtsumme Netto und Gesamtsumme MwSt herangezogen werden. Die sind in der Rechungsttabelle und MwSt-Tabelle. In den Rechungspositionen sind nur die Zwischensummen je Rechnungsposition. Damit darf aus rechtlichen Gründen nicht gerechnet werden. Immer nur mit der Endsumme.

rokli 1. Feb 2021 16:02

AW: Join: Datensätze sind mehrfach vorhanden, sollen sie aber nicht
 
He BlueStarHH,

den Tipp von jobo würde ich mir an Deiner Stelle noch mal genauer ansehen, denn auf der einen Seite schreibst Du "... aus rechtlichen Gründen nicht nehmen ..." aber auf der anderen Seite gehst Du das Risiko ziemlich ungenauer Tabellenverknüpfungen ein.

Grüße

BlueStarHH 1. Feb 2021 16:23

AW: Join: Datensätze sind mehrfach vorhanden, sollen sie aber nicht
 
Zitat:

Zitat von rokli (Beitrag 1481940)
He BlueStarHH,

den Tipp von jobo würde ich mir an Deiner Stelle noch mal genauer ansehen, denn auf der einen Seite schreibst Du "... aus rechtlichen Gründen nicht nehmen ..." aber auf der anderen Seite gehst Du das Risiko ziemlich ungenauer Tabellenverknüpfungen ein.

Grüße

Sehr gut, dass Du darauf hinweis. Aber auch nach reichlicher Überlegen gilt:

An den Tabellenverknüpfungen ist nichts ungenau. Die Rechnungsnummern ist eindeutig, über die die Tabellen verknüpft sind.
Die Zwischensummen aus den Artikelposition hingegen *sind* ungenau (Rundungsdifferenzen, das im Detail würde hier zu weit führen).

Blup 3. Feb 2021 11:31

AW: Join: Datensätze sind mehrfach vorhanden, sollen sie aber nicht
 
Warum nicht über ein Sub-Select?
SQL-Code:
select R.ReNr, R.Netto, (select sum(M.MwStBetrag) from MwSt M where M.ReNr = R.ReNr) MwStSumme
from  Rechnung R
where (R.Datum >= '2020-01-01') and (R.Datum <= '2020-12-31')


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf