![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: Zeos
mittelschweres Select über mehrere Tabellen
Folgende Situation:
Ein SQL-Anfänger, ich, hat zwei Tabellen, Debitoren und Fibu. Nun möchte ich in ner Select alle Debitoren auswählen und zusätzlich aus der Fibu die Spalte Saldo. Also eigentlich nur
SQL-Code:
Nun gibt es neben fibu.Saldo auch fibu.konto in dieser steht die Debitoren.DebitorenNr. Also soll das auch zugeordnet werden. Aber es kommt noch schlimmer: Zu jeder DebitorenNr gibt es mehrete Datensätze in fibu. Nun soll aber nur der Datensatz mit der höchsten ID genommen werden. Ein erstes Ansatz mit
SELECT Debitoren.DebitorenNr, Debitoren.KRZ, Debitoren.DienststellenNr, Debitoren.Anrede, Debitoren.Zuname, Debitoren.Vorname, Debitoren.Eintritt, Fibu.Saldo FROM Debitoren, Fibu ORDER BY DebitorenNr
SQL-Code:
liefert einige Probleme zu Tage, zB das nur noch die Debitoren angezeigt werden, bei denen auch eine Buchung vorhanden ist.
SELECT Debitoren.DebitorenNr, Debitoren.KRZ, Debitoren.DienststellenNr, Debitoren.Anrede, Debitoren.Zuname, Debitoren.Vorname, Debitoren.Eintritt, Fibu.Saldo FROM Debitoren, Fibu Where (fibu.konto = debitoren.debitorennr)
Irgendjemand ne Idee, welche SQL-Befehle mir da weiter helfen können? |
Re: mittelschweres Select über mehrere Tabellen
Hallo Thomas,
es ist nicht unbedingt gut, wenn du in der Tabelle FIBU einen Saldo mitführst. Es handelt sich beim Saldo ja schließlich um ein berechnetes Feld.
SQL-Code:
Ist jetzt nicht getestet, aber vielleicht hilft es dir auf die Sprünge.
SELECT d.DebitorenNr, SUM(f.Buchungsbetrag) AS Saldo
FROM Debitoren d LEFT OUTER JOIN Fibu f ON f.Konto = d.DebitorenNr GROUP BY d.DebitorenNr Grüße vom marabu |
Re: mittelschweres Select über mehrere Tabellen
Zitat:
SQL-Code:
Hi Thomas,
SELECT D.DebitorenNr,
D.KRZ, D.DienststellenNr, D.Anrede, D.Zuname, D.Vorname, D.Eintritt, F.Saldo FROM Debitoren D, Fibu F Where ((F.konto = D.debitorennr) or (F.konto is null)) nen Left Outer Join kann man simulieren, indem du die Verknüpfungsbedinung um de ... is null ... part erweitert. Das Feld, welches auf is null geprüft wird sollte aus der Tabelle kommen, deren Datensätze evtl nicht vorhanden sind. [edit]Leider weiß ich gar nichts über Firebird und ob Left outer Joins unterstützt werden, daher die simulierte Variante.[/edit] Nun folgt eine Kann-Regel: Immer Alias Vergeben (siehe Abfrage). Muss man nicht machen, finde es nur lesbarer und schneller zu tippen. MfG David |
Re: mittelschweres Select über mehrere Tabellen
Hi marabu,
keine Panik, das Feld Saldo ist auch ein berechnetes Feld ;-) Deswegen komm ich mit deinem Code auch nur halb zu Recht. Wenn ich die von mir benötigten Spalten aus Debitoren mitnehme sieht das so aus:
SQL-Code:
Nun möchte ich das Saldo aber ja nicht summieren, lasse ich aber das sum weg, möchte Firebird f.saldo mit in der Group By haben.
SELECT d.DebitorenNr, d.KRZ, d.DienststellenNr, d.Anrede, d.Zuname, d.Vorname, SUM(f.Saldo) AS Saldo
FROM Debitoren d LEFT OUTER JOIN Fibu f ON f.Konto = d.DebitorenNr GROUP BY d.DebitorenNr, d.KRZ, d.DienststellenNr, d.Anrede, d.Zuname, d.Vorname, d.Eintritt Mache ich das, so bekomme ich die Datensätze mit einem Saldo mehrfach. Mit
SQL-Code:
bekomme ich das richtige Ergebniss, allerdings ist die Tabellenstruktur vorgegeben, und wenn es das Feld schon gibt, würde ich das schon ganz gerne nutzen ;-)
SELECT d.DebitorenNr, d.KRZ, d.DienststellenNr, d.Anrede, d.Zuname, d.Vorname, (SUM(f.Haben)-SUM(f.Soll)) AS Saldo
FROM Debitoren d LEFT OUTER JOIN Fibu f ON f.Konto = d.DebitorenNr GROUP BY d.DebitorenNr, d.KRZ, d.DienststellenNr, d.Anrede, d.Zuname, d.Vorname, d.Eintritt @David Haut auch mit der über ICQ besprochenen Änderung nicht hin, trotzdem Danke ;-) Firebird kennt übrigens Left Outer joins, falls du mal was mit Interbase gemacht hast, die Syntax ist fast identisch. |
Re: mittelschweres Select über mehrere Tabellen
So, dank Davids Hilfe per ICQ ist das ganze jetzt gelöst:
SQL-Code:
Wahlweise auch ohne GROUP BY ;-)
SELECT d.DebitorenNr,
d.KRZ, d.DienststellenNr, d.Anrede, d.Zuname, d.Vorname, F.Saldo FROM Debitoren d LEFT OUTER JOIN Fibu f ON f.Konto = d.DebitorenNr AND (f.ID = (SELECT MAX(F1.ID) FROM Fibu F1 Where F1.Konto = F.Konto)) GROUP BY d.DebitorenNr, d.KRZ, d.DienststellenNr, d.Anrede, d.Zuname, d.Vorname, d.Eintritt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz