![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: ZEOS
SQL-Abfrage über mehrer Tabellen
Hallo,
ich benötige eine verschachtelte Abfrage über mehrere Tabellen und komme da nicht weiter. Für eine EU-Steuerliste benötige ich alle Umsätze der Kunden aus der EU Meine Datenstruktur Rechnungsdatei mit Kunden_ID auf Kundendatenbank verlinkt Die Kundendatenbank ist über Kunden_ID mit Adressdatenbank verbunden; hier sollen die berücksichtigt werden, welche im Adresstyp die "Hauptadresse" enthält; die Adressdatenbank ist über eine Länder_ID auf eine Länderliste, aus der das Land und die EU-Zugehörgkeit entnommen werden kann. Bisher lautet mein SQL
Delphi-Quellcode:
SELECT RE.*, K.Kunden_ID, K.Kunden_Name from FROM RECHNUNG RE INNER JOIN KUNDEN K ON K.KUNDEN_ID = RE.RECHNUNGS_KUNDENID
WHERE IN SELECT A.KundenID, A.Land_ID, A.AdressTyp, L.LAENDER_EU FROM ADRESSE A WHERE A.AdressTyp = 'Hauptadresse' inner JOIN LAENDER L ON A.LAND_ID = L.Laender_ID where L.LAENDER_EU = '1'... |
AW: SQL-Abfrage über mehrer Tabellen
Vielleicht habe ich falsch verstanden, aber warum machst du nicht einen JOIN über alle Tabellen mit den nötigen Einschränkungen?
(mangels geeigneter Datenbank ungetestet)
Delphi-Quellcode:
SELECT RE.*, K.Kunden_ID, K.Kunden_Name
FROM FROM RECHNUNG RE INNER JOIN KUNDEN K ON (K.KUNDEN_ID = RE.RECHNUNGS_KUNDENID) INNER JOIN ADRESSE A ON (K.KUNDEN_ID = A.KundenID) and (A.AdressTyp = 'Hauptadresse') INNER JOIN LAENDER L ON (A.LAND_ID = L.Laender_ID) and (L.LAENDER_EU = '1') |
AW: SQL-Abfrage über mehrer Tabellen
Hallo,
vielen Dank, funktioniert,(auch ungetestet), da habe ich wohl zu kompliziert gedacht ... mfg |
AW: SQL-Abfrage über mehrer Tabellen
Hallo,
wie kann ich jetzt noch Rechnungssumme und Anzahl der Rechnungen je Kunde mit integrieren. Folgendes schlägt fehl
Delphi-Quellcode:
oder Alternativ
SELECT
RE.RECHNUNGS_KUNDENNR, K.Kunden_ID, K.Kunden_Name, x.Summe, x.anzahl FROM FROM RECHNUNG RE INNER JOIN KUNDEN K ON (K.KUNDEN_ID = RE.RECHNUNGS_KUNDENID) INNER JOIN ADRESSE A ON (K.KUNDEN_ID = A.KundenID) and (A.AdressTyp = 'Hauptadresse') INNER JOIN LAENDER L ON (A.LAND_ID = L.Laender_ID) and (L.LAENDER_EU = '1') INNER JOIN (SELECT Count(*) as anzahl, SUM(RECH.RE_BETRAG) as Summe FROM RECHNUNG Rech Group by Rech.RECHNUNGS_KUNDENID) as x
Delphi-Quellcode:
Laufen auf Fehler sobald ich z.B. Werte aus der Kundentabelle hinzufüge, hier K.Kunden_Name,
SELECT
RE.RECHNUNGS_KUNDENID, K.Kunden_Name, ( SELECT COUNT(*) FROM RECHNUNGEN Rech) AS Anzahl, ( SELECT SUM(RECHNUNGS_BETRAG_D) FROM RECHNUNGEN Rech) AS Summe FROM FROM RECHNUNG RE INNER JOIN KUNDEN K ON (K.KUNDEN_ID = RE.RECHNUNGS_KUNDENID) INNER JOIN ADRESSE A ON (K.KUNDEN_ID = A.KundenID) and (A.AdressTyp = 'Hauptadresse') INNER JOIN LAENDER L ON (A.LAND_ID = L.Laender_ID) and (L.LAENDER_EU = '1') Group by RE.RECHNUNGS_KUNDENID) Ich kann mir nicht erklären, warum. |
AW: SQL-Abfrage über mehrer Tabellen
In Deinem ersten Versuch fehlt im Select neben Summe und Anzahl ein Feld (ID) über das der Join gehen soll. Außerdem fehlt das Joinkriterium.
Im 2. Versuch fehlt die Gruppierung des neu aufgenommenen Feldes. Falls Du von mySQL kommst, da kann man das je nach Konfiguration weglassen, ist aber m.E. nicht empfehlenswert, weil die DB sich dann selbst überlegen muss, wonach gruppiert werden soll und das macht mySQL schon nicht gut. Also mach es lieber selbst, ich kenne keine andere DB (auch nicht Firebird), die so eine schreibweise akzeptiert. Faustregel, * alle Felder der Select Clause, die nicht aggregiert werden, müssen in die Group By Clause aufgenommen werden. * hier könnte ein "Mindestens" rein, es dürfen halt auch mehr sein, macht aber selten Sinn. Bedeutet, man kann nach Feldern gruppieren, die nicht ausgegeben werden. |
AW: SQL-Abfrage über mehrer Tabellen
Hallo,
vielen Dank, für den Hinweis, hatte ich übersehen. Habs dann doch noch hinbekommen |
AW: SQL-Abfrage über mehrer Tabellen
Hallo,
ich möchte meine Abfrage nun um eine zusätzliche Summenabfrage erweitern. Wie kann ich nun, auf Basis der ersten Abfrage Daten, per SQL auf diese Daten zugreifen. Ich möchte zur Optimierung vermeiden, dass ich zwecks Summenbildung wieder auf die gesamte Datentabelle zurückgreifen muss. Ich denke Master/Detail ist hier der Weg oder ? Wie kann ich dies umsetzten ? |
AW: SQL-Abfrage über mehrer Tabellen
Nach der Abfrage befindet sich das Ergebnis nicht mehr auf dem Server. Somit ist eine weitere Bearbeitung oder erneute Abfrage auf dem Server nicht mehr möglich.
Möglich ist die Rückgabe von mehreren Resultsets (z.B. aus einer Stored Procedure). Dort würde man die Daten in eine temporäre Tabelle schreiben, diese zurückliefern und dann noch eine Aggregate-Abfrage über die temporäre Tabelle zurückliefern. Der einfachste Weg führt eigentlich über das Resultset am Client, wo man die Aggregates selber bildet. |
AW: SQL-Abfrage über mehrer Tabellen
Was meinst Du mit zusätzlicher Summe?
U.U. wäre eine SP sinnvoll. |
AW: SQL-Abfrage über mehrer Tabellen
Hallo,
für mich selber noch einmal zum Verständnis. Die Abfragemenge befindet sich bei mir nun in einer Query (z.B. Query_SteuerJahr) mit zugehöriger Datasource. Eine direkter Summenbildung , z.B. der Umsatzbeträge aus Query_SteuerJahr ist über SQL nicht möglich, bedeutet, muss diese Datenmenge in einer Procedure (z.B. Summierung über einen Durchlauf der einzelnen Datenmengen) bilden, oder vorher alles in eine Temporäre Tabelle ablegen ? |
AW: SQL-Abfrage über mehrer Tabellen
Überleg doch mal, wo sich was befindet und wer wann was wie abarbeitet.
Die Datenbank kennt deine Query-Komponente nicht. Die Query-Komponente sendet das Statement zur Datenbank, die Datenbank führt das Statement aus und liefert das Ergebnis zurück. Die Query-Komponete wertet dieses Ergebnis aus und stellt es der Anwendung zur Verfügung. |
AW: SQL-Abfrage über mehrer Tabellen
Die SP läuft auch auf dem Datenbankserver und kann in einer Abfrage wie eine Tabelle abgefragt werden.
Noch mal die Frage, was meinst Du mit weiterer Summe? Summierung über anderes Feld? Weitere Einschränkung? |
AW: SQL-Abfrage über mehrer Tabellen
Hallo MKinzler
ich habe in einer ersten Abfrage nur die einzelnen Datensätze mit Umsatzwerte etc. aus einer Rechnungstabelle. Diese bringe ich im Anschluss in einem Grid zur Anzeige. Auf Basis dieser Abfrage möchte ich eine Spaltensumme in einem GridFooter anzeigen und benötige die Summe, z.B. der Umsatzspalte. Mir ist bewusst, dass die Abfrage im Speicher des Clients liegt, Zur Summenbildung habe ich derzeit 2 Wege eingeschlagen. 1.) Neue Abfrage der Summen über die gesamte Tabelle 2.) Summenbildung nach erster Abfrage in einer separaten Proc Ich suche halt nach ner Optimierung der Geschwindigkeit, beides funktioniert. |
AW: SQL-Abfrage über mehrer Tabellen
Da sich die gewünschten Werte auf die gleichen Werte beziehen ( verschieden zusammengefasst) sollte eine Abfrage genügen. Einfach einmal durch die Datenmenge gehen und die Werte summieren.
Es gibt auch Grids, welche eine Summierung von sich aus können. |
AW: SQL-Abfrage über mehrer Tabellen
Von einem 2.schrittigen Verfahren würde ich dringend abraten, da ohne weiteres die Konstistenz der beiden Ergebnisse nicht gewahrt ist. Sprich die Summe, die im 2. Schritt abgefragt wird, basiert ggF. schon auf einer verlichen zum 1. Schritt geänderten Datenbasis. (Trifft u.U. in einem Einzelplatzsystem nicht zu)
In einer Abfrage kann man den Befehl "rollup" verwenden, der automatisch Gesamtsummen liefert. Das hat hier 2 Nachteile:
Die naheliegendste Möglichkeit bleibt damit m.E. wie von Markus Kinzler beschrieben eine manuelle Aufsummierung oder ein Gridkomponente mit Summenfunktion. |
AW: SQL-Abfrage über mehrer Tabellen
Rollup würde ich aber eher mit einer SP lösen. Die Lösung über UNION wären ja 2 wieder 2 getrennte Abfragen ( allerdings auf den selben Datenstand)
|
AW: SQL-Abfrage über mehrer Tabellen
Du kannst auch ein VIEW aus der ersten Select Anweisung erstellen und davon dann ein
neues Select mit SUM, MAX, WHERE etc erstellen Gruß Michael |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 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