AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Join: Datensätze sind mehrfach vorhanden, sollen sie aber nicht

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

Ein Thema von BlueStarHH · begonnen am 1. Feb 2021 · letzter Beitrag vom 3. Feb 2021
Antwort Antwort
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
628 Beiträge
 
Delphi 10.3 Rio
 
#1

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

  Alt 1. Feb 2021, 08:25
Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.770 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 1. Feb 2021, 08:46
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-01and Datum <= '2020-12-31';
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.947 Beiträge
 
Delphi 2010 Enterprise
 
#3

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

  Alt 1. Feb 2021, 08:53
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.694 Beiträge
 
Delphi 6 Enterprise
 
#4

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

  Alt 1. Feb 2021, 11:18
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
Ralph
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
628 Beiträge
 
Delphi 10.3 Rio
 
#5

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

  Alt 1. Feb 2021, 12:39
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.
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
628 Beiträge
 
Delphi 10.3 Rio
 
#6

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

  Alt 1. Feb 2021, 12:42
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.
  Mit Zitat antworten Zitat
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
243 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 1. Feb 2021, 16:02
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
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
628 Beiträge
 
Delphi 10.3 Rio
 
#8

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

  Alt 1. Feb 2021, 16:23
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).
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
1.296 Beiträge
 
Delphi 2007 Professional
 
#9

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

  Alt 3. Feb 2021, 11:31
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')
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 12:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf