AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei Left Join

Ein Thema von Ykcim · begonnen am 13. Sep 2021 · letzter Beitrag vom 14. Sep 2021
Antwort Antwort
Seite 1 von 3  1 23      
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#1

Fehler bei Left Join

  Alt 13. Sep 2021, 11:50
Datenbank: MSSql • Version: 11 • Zugriff über: FireDac
Hallo Zusammen,

ich habe eine Query über mehrere Tabelle mit Left Join. Eigentlich klappt auch alles. Allerdings ist jetzt nach ein paar Wochen aufgefallen, dass zwei Werte, die summiert werden, falsch sind.

Delphi-Quellcode:
SELECT    a.zynrefkl AS 'Artikelnummer',
         a.afg_oms1 AS 'Artikelbezeichnung 1',
         concat('VPE:',a.per__chk,' Stück') AS 'Artikelbezeichnung 2',
         'AS 'Artikelbezeichnung 3',
         'AS 'Artikelbezeichnung 4',
         'AS 'Artikelbezeichnung 5',
         'AS 'Artikelbezeichnung 6',
         b.in__vrrd AS 'Bestand',
         a.per__chk AS 'Abgreifmenge',
         a.minstock AS 'Mindestbestand',
         CASE WHEN b.in__vrrd < a.minstock then 'Mindestmenge unterschrittenELSE 'END AS 'Bestandskommentar',
         'AS 'Kommentar',
         COALESCE(SUM(c.b_aantal),0) AS 'Rückstand',
         COALESCE(SUM(d.aant_uit), 0) AS 'Gesamtverbrauch'
FROM afgart__ a
LEFT JOIN afgant__ b ON b.afg__ref = a.afg__ref
LEFT JOIN bstlyn__ c ON c.afg__ref = a.afg__ref AND c.levv_dat<GETDATE() AND c.lbn__ref = '
LEFT JOIN hisafg__ d ON d.afg__ref = a.afg__ref
LEFT JOIN gegdet__ e on e.det__ref = a.afg__ref AND e.vrg__ref = '000002and tabname_ = 'afgart__'
WHERE a.kla__rpn = 'MEYLE'
AND a.zynrefkl <> ''
AND (e.antw_txt <> '1or e.antw_txt is NULL)
AND c.zynrefkl='108470001'
GROUP BY a.zynrefkl, a.afg_oms1, b.in__vrrd, a.per__chk, a.minstock
order by a.zynrefkl
Das Problem tritt durch die Zeile LEFT JOIN hisafg__ d ON d.afg__ref = a.afg__ref Ohne die Tabelle d wird der Rückstand (Tabelle C) korrekt berechnet. Aber mit der Tabelle D kommt eine viel zu hohe Summe für den Rückstand raus und auch der Gesamtverbrauch ist viel zu hoch.

Sieht jemand, was ich falsch mache?

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 13:12
Bist Du Dir sicher, dass ein LEFT (OUTER) JOIN hier die richtige Wahl ist? Was kommt denn bei einem INNER JOIN heraus?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Papaschlumpf73
Online

Registriert seit: 3. Mär 2014
Ort: Berlin
442 Beiträge
 
Delphi 12 Athens
 
#3

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 13:45
Wenn Tabelle hisafg__ d hier mehrere Treffer für einen Datensatz aus Tabelle a liefert (d.afg__ref = a.afg__ref) werden auch für alle anderen Tabellen so viele Datensätze wie Treffer in d angezeigt. Also wenn d 3 Treffer für einen Datensatz aus a hat, wird auch der eine Datensatz aus a, b, c usw. 3 mal angezeigt. Somit können Berechnungsergebnisse komplett aus dem Ruder geraten.
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 13:53
Mit INNER Join habe ich leider das gleiche Ergebnis bekommen...

Ich versuche es gerade so zu lösen.

Delphi-Quellcode:
SELECT    a.zynrefkl AS 'Artikelnummer',
         a.afg_oms1 AS 'Artikelbezeichnung 1',
         concat('VPE:',a.per__chk,' Stück') AS 'Artikelbezeichnung 2',
         'AS 'Artikelbezeichnung 3',
         'AS 'Artikelbezeichnung 4',
         'AS 'Artikelbezeichnung 5',
         'AS 'Artikelbezeichnung 6',
         b.in__vrrd AS 'Bestand',
         a.per__chk AS 'Abgreifmenge',
         a.minstock AS 'Mindestbestand',
         CASE WHEN b.in__vrrd < a.minstock then 'Mindestmenge unterschrittenELSE 'END AS 'Bestandskommentar',
         'AS 'Kommentar',
      (SELECT COALESCE(SUM(c.b_aantal),0) FROM bstlyn__ c WHERE c.afg__ref=a.afg__ref
                                                          AND c.levv_dat<GETDATE()
                                                          AND c.lbn__ref = '') AS 'Rückstand',
      (SELECT COALESCE(SUM(d.aant_uit),0) FROM hisafg__ d WHERE d.afg__ref=a.afg__ref) AS 'Gesamtverbrauch'
FROM afgart__ as a
LEFT JOIN afgant__ b ON b.afg__ref = a.afg__ref
LEFT JOIN gegdet__ e on e.det__ref = a.afg__ref and vrg__ref = '000002and tabname_ = 'afgart__'
WHERE a.kla__rpn = 'MEYLE'
AND (e.antw_txt <> '1or e.antw_txt is NULL)
AND a.zynrefkl <> ''
AND a.zynrefkl='108470001'
GROUP BY a.zynrefkl, a.afg__ref, a.afg_oms1, b.in__vrrd, a.per__chk, a.minstock
order by a.zynrefkl
Das klappt zwar in HeidiSQL, aber leider zickt mein Programm damit rum...
Irgendwie stelle ich mich gerade ziemlich doof an...
Patrick
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 13:55
@PapaSchlumpf: Es gibt mehrere Datensätze in der Tabelle. Aber werden die nicht durch sie Summierung gruppiert?
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 14:09
Lass mal die SUM und GROUP BY Anweisungen weg und analysiere die tatsächlich zurückgegebenen Datensätze.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#7

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 14:22
Was willst Du damit erreichen? COALESCE(SUM(d.aant_uit),0)
Soll hier 0 geliefert werden, wenn die Summe aller d.aant_uit = Null ist oder soll hier, wenn d.aant_uit = null ist, bei der Summenbildung anstellte von Null 0 genommen werden?

Bei mir sähe es jedenfalls so aus: SUM(COALESCE(d.aant_uit,0)) Je nach Datenbank kann es (soweit ich mich erinnere) passieren, dass die Summe mehrere Zahlen = null ist, wenn mindestens eine Zahl = Null ist.
Quasi sowas:
SQL-Code:
SUM(1 + 1 + 1) = 3
SUM(1 + Null + 1) = Null
Prüfe bitte mal nach, wie sich MSSql in einer derartigen Situation verhält.
  Mit Zitat antworten Zitat
Papaschlumpf73
Online

Registriert seit: 3. Mär 2014
Ort: Berlin
442 Beiträge
 
Delphi 12 Athens
 
#8

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 14:46
Lass mal die SUM und GROUP BY Anweisungen weg und analysiere die tatsächlich zurückgegebenen Datensätze.
Das ist eine gute Idee. Du wirst sehen, dass die Datensätze doppelt und dreifach sind. Und SUM() rechnet die dann auch doppelt und dreifach zusammen. GROUP BY bezieht sich nur auf die Datenfelder, die nicht summiert werden.
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 15:30
Also es ist tatsächlich so, dass ich dann jeden Datensatz 4 mal bekomme...
Kann ich beim LEFT JOIN irgendwie gruppieren?

Ich habe gerade bemerkt, dass nur die Kombination aus
LEFT JOIN bstlyn__ c ON c.afg__ref = a.afg__ref AND c.levv_dat<GETDATE() AND c.lbn__ref = '' und
Left JOIN hisafg__ d ON d.afg__ref = a.afg__ref zu Fehlern führt.

Egal welches ich entferne, das andere wird dann korrekt berechnet...
Patrick

Geändert von Ykcim (13. Sep 2021 um 15:41 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#10

AW: Fehler bei Left Join

  Alt 13. Sep 2021, 15:55
In #4 warst du schon auf dem richtigen Weg.
Allerdings wurde dort plötzlich die Bedingung verändert:
Code:
AND a.zynrefkl <> ''
AND (e.antw_txt <> '1' or e.antw_txt is NULL)
AND c.zynrefkl='108470001'
Code:
AND (e.antw_txt <> '1' or e.antw_txt is NULL)
AND a.zynrefkl <> ''
AND a.zynrefkl='108470001'
"a.zynrefkl='108470001'" ist falsch.
Die Bedingung "c.zynrefkl='108470001'" gehört in die Abfrage von c.
Zumindest wenn das orginale SQL richtig war.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 +1. Es ist jetzt 12:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz