AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL-Abfrage über mehrer Tabellen
Thema durchsuchen
Ansicht
Themen-Optionen

SQL-Abfrage über mehrer Tabellen

Ein Thema von waldforest · begonnen am 30. Mär 2015 · letzter Beitrag vom 6. Apr 2015
Antwort Antwort
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#1

SQL-Abfrage über mehrer Tabellen

  Alt 30. Mär 2015, 17:15
Datenbank: Firebird • Version: 2.5 • Zugriff über: ZEOS
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'...
mfg wf
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: SQL-Abfrage über mehrer Tabellen

  Alt 30. Mär 2015, 17:25
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')
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: SQL-Abfrage über mehrer Tabellen

  Alt 30. Mär 2015, 19:19
Hallo,
vielen Dank, funktioniert,(auch ungetestet), da habe ich wohl zu kompliziert gedacht ...
mfg
mfg wf
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: SQL-Abfrage über mehrer Tabellen

  Alt 2. Apr 2015, 19:48
Hallo,
wie kann ich jetzt noch Rechnungssumme und Anzahl der Rechnungen je Kunde mit integrieren.
Folgendes schlägt fehl

Delphi-Quellcode:
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
oder Alternativ
Delphi-Quellcode:
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)
Laufen auf Fehler sobald ich z.B. Werte aus der Kundentabelle hinzufüge, hier K.Kunden_Name,
Ich kann mir nicht erklären, warum.
mfg wf

Geändert von waldforest ( 2. Apr 2015 um 21:37 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: SQL-Abfrage über mehrer Tabellen

  Alt 3. Apr 2015, 07:53
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.
Gruß, Jo
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: SQL-Abfrage über mehrer Tabellen

  Alt 3. Apr 2015, 09:29
Hallo,
vielen Dank, für den Hinweis, hatte ich übersehen.
Habs dann doch noch hinbekommen
mfg wf

Geändert von waldforest ( 3. Apr 2015 um 11:34 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:42 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