collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 71
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 0

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 13914
  • stats Beiträge insgesamt: 65797
  • stats Themen insgesamt: 8880
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: Unterabfrage, oder Formel?  (Gelesen 360 mal)

Offline Xoar

  • Access-Profi
  • **
  • Beiträge: 398
Unterabfrage, oder Formel?
« am: Dezember 17, 2017, 12:18:55 »
Hallo SQL Experten,

leider tue ich mich in Sachen SQL immer noch sehr schwer, deshalb hoffe ich auf eure Hilfe.

Folgendes: Ich habe eine tblFahrzeuge, wo alle meine Fahrzeuge gelistet sind, dann eine tblFahrzeugeBuchungen wo alle Fahrzeuge eingetragen sind, bei denen eine Buchung/Reservierung vorliegt.

Ich möchte gerne im Hauptformular (Endlosansicht) ein Feld haben wo ich das früheste Buchungsdatum sehen kann, das klappt auch mit dem unten geschriebenen SQL-Code
SELECT F.FahrzeugKennzeichen, F.FahrzeugKennung, Min(B.vonDatum) AS KleinstesDatum
FROM tblFahrzeuge AS F LEFT JOIN tblFahrzeugBuchungen AS B ON F.FahrzeugID = B.FahrzeugID_F
GROUP BY F.FahrzeugKennzeichen, F.FahrzeugKennung;

Jetzt möchte ich aber auch noch den Buchungsstatus dargestellt haben (ist einfach ne 1 für Reserviert, 2 Werkstatt...), diese ist in der tblFahrzeugeBuchungen eingetragen.

wenn ich das Feld einfach hinzufüge klappt das natürlich nicht, da ich nicht nach dem Feld gruppieren kann.
SELECT F.FahrzeugKennzeichen, F.FahrzeugKennung, Min(B.vonDatum) AS KleinstesDatum, B.Buchungsstatus
FROM tblFahrzeuge AS F LEFT JOIN tblFahrzeugBuchungen AS B ON F.FahrzeugID = B.FahrzeugID_F
GROUP BY F.FahrzeugKennzeichen, F.FahrzeugKennung, B.Buchungsstatus;

Mir schwirrt das von was Unterabfragen im Kopf, aber das klappt noch nicht so.
SELECT F.FahrzeugKennzeichen, F.FahrzeugKennung, B.Buchungsstatus, qryMinDatum.MinvonvonDatum
FROM (tblFahrzeuge AS F LEFT JOIN qryMinDatum ON F.FahrzeugID = qryMinDatum.FahrzeugID_F) LEFT JOIN tblFahrzeugBuchungen AS B ON qryMinDatum.FahrzeugID_F = B.FahrzeugID_F
GROUP BY F.FahrzeugKennzeichen, F.FahrzeugKennung, B.Buchungsstatus, qryMinDatum.MinvonvonDatum;

Wie bekomme es in der Abfrage hin, dass mir noch zusätzlich der Buchungsstatus von "KleinstesDatum" (siehe oben SQL Code) angezeigt wird?



 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 881
Re: Unterabfrage, oder Formel?
« Antwort #1 am: Dezember 17, 2017, 13:52:08 »
Meine Maxime dabei wäre der Ansatz: Erst rechnen, dann verknüpfen. Das weicht deutlich von der üblichen Verfahrensweise ab. Da werden die Tabellen in den Abfrageeditor gezogen, womit die Verknüpfungen durch die Nachahmung der Beziehungen automatisch und sofort gegeben sind und seltenst dann zum Zeitpunkt hinterfragt werden. Das erhaltene Konstrukt lässt sich dann mehr oder wie hier weniger in die gewünschte Richtung weiterverarbeiten.

Rechnen: Die eigentliche Rechnung ist das kleinste Datum pro Fahrzeug. Die nötigen Daten dazu sind in der einzelnen Tabelle vorhanden:
SELECT FahrzeugID_F, Min(vonDatum) AS KleinstesDatum
FROM tblFahrzeugBuchungen GROUP BY FahrzeugID_F
Hier hätte man nebenbei eine flachere Tabelle (weniger Datensätze), die mit der Fahrzeugtabelle zu verknüpfen wäre im Vergleich zu obigen Codes. Über die Effekte bzgl. Aufwand beim Verknüpfen als auch beim Gruppieren kann man nebenbei nachdenken.

Hier sind wir aber nicht fertig, sondern es werden weitere Felder aus der gleichen Tabelle benötigt. Diese erhalten wir durch Verknüpfen der Rechnenabfrage mit der Tabelle (so eine Art SELF JOIN):
SELECT
   B.*
FROM
   (
      SELECT
         FahrzeugID_F,
         MIN(vonDatum) AS KleinstesDatum
      FROM
         tblFahrzeugBuchungen
      GROUP BY
         FahrzeugID_F
   ) AS R
      INNER JOIN tblFahrzeugBuchungen AS B
      ON R.FahrzeugID_F = B.FahrzeugID_F
         AND
      R.KleinstesDatum = B.vonDatum
In der guten Praxis wird man statt des * die Liste der wirklich benötigten Felder verwenden für ein schlankes Recordset, hier dient es nur dem Verkürzen der Schreibarbeit sowie der Sichtbarmachung, dass alle Felder nutzbar sind.

Diese Abfrage wird nun und jetzt erst mit der Fahrzeugtabelle verknüpft, um statt der Fahrzeug-ID die Klarnamen für Kennzeichen und Kennung anzeigen zu können. Diese Ausführung überlasse ich jetzt dem Interessierten.
Mit freundlichem Glück Auf!

Eberhard
 
Folgende Mitglieder bedankten sich: Xoar, PhilS

Offline Xoar

  • Access-Profi
  • **
  • Beiträge: 398
Re: Unterabfrage, oder Formel?
« Antwort #2 am: Dezember 17, 2017, 14:04:47 »
Es klappt wunderbar, genau so hab ich mir das erhofft.

Sowas erspart mir viel VBA Code :)

Besten dank, Du hast meinen Sonntag gerettet.