collapse

* Benutzer Info

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

* Wer ist Online

  • Punkt Gäste: 60
  • Punkt Versteckte: 1
  • Punkt Mitglieder: 1

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 13632
  • stats Beiträge insgesamt: 61212
  • stats Themen insgesamt: 8356
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 16
  • stats Am meisten online: 415

Autor Thema: Unterabfrage  (Gelesen 124 mal)

Offline hajott

  • Newbie
  • Beiträge: 11
Unterabfrage
« am: August 02, 2017, 08:39:01 »
Hallo Leute,

ich habe gerade eine Denkblockade... ich denke, die Lösung meines Problems ist ganz einfach. Aber ich komme grad nicht drauf.

Gegeben ist eine Tabelle mit
Aktennummer (Integer)
Kundennummer (als String)
Kundenname (als String)

Pro Kunde gibt es eine Akte. Leider hat jeder Kunde manchmal mehrere Kundennummern mit ggf. leicht abweichenden Namen. Beispiel:

Aktennr     Kundennummer       Kundenname
    1                    0815                  Peter Meier
    2                    4711                  Karl Müller
    2                    3333                  Karl P. Müller
    2                    3939                  Carl Müller

Ich brauche nun eine Abfrage, bei der nach der Aktennummer gruppiert ist und einer der Einträge auf Kundenebene da steht, also

SELECT
   Aktennr,
   MIN(Kundennummer),
   MIN(Kundenname)
FROM
   Tabelle
GROUP BY
  Aktennr;


Das liefert für Akte 2 Kundennummer "3333" und Name "Carl Müller". Es soll dort aber der Name stehen, der zu der 3333 gehört, also Karl P. Müller.

Ich weiß auch, dass es eine Unterabfrage mit derselben Tabelle sein muss, aber ich komm nicht drauf, wie man das strickt...

Vielen Dank!

Hans-Jürgen
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 764
Re: Unterabfrage
« Antwort #1 am: August 02, 2017, 08:55:41 »
Notwendige Berechnung ausführen und danach  die restlichen Informationen hinzuverknüpfen:
SELECT
   T.*
FROM
   (
      SELECT
         Aktennr,
         MIN(Kundenname) AS MinKuName
      FROM
         Tabelle
      GROUP BY
         Aktennr
   ) AS B
      INNER JOIN Tabelle AS T
      ON B.Aktennr = T.Aktennr
         AND
      B.MinKuName = T.Kundenname
Mit freundlichem Glück Auf!

Eberhard
 

Offline Beaker s.a.

  • Access Guru
  • ****
  • Beiträge: 1409
nachgefragt
« Antwort #2 am: August 02, 2017, 10:13:25 »
Hallo Eberhard,
Wertet Min(Kundenname) den String nicht in alphabetischer Reihenfolge aus?
Dann wäre das Ergebnis "Carl Müller", oder nicht?
Das gewünschte Ergebnis "Karl P. Müller" würde IMO mit Min(Kundennummer) zu erreichen sein.
Bitte berichtige mich, falls ich das falsch interpretiere.
gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 764
Re: Unterabfrage
« Antwort #3 am: August 02, 2017, 12:00:15 »
Ich hatte mich schlicht an der Vorgabe MIN(Kundenname) orientiert, die Kundennummer könnte man gleichlautend verwenden.

Wenn der TE dies eigenständig umswitcht, wäre das eher ein Zeichen, dass er die Abfragekonstruktion an sich verstanden hat, als wenn er nur schlicht kopieren würde.
Mit freundlichem Glück Auf!

Eberhard
 

Offline Beaker s.a.

  • Access Guru
  • ****
  • Beiträge: 1409
Re: Unterabfrage
« Antwort #4 am: August 02, 2017, 16:11:29 »
Hallo Eberhard,
Danke.
Dann waren meine Vermutungen ja richtig.
gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.
 

Offline hajott

  • Newbie
  • Beiträge: 11
Re: Unterabfrage
« Antwort #5 am: August 02, 2017, 17:32:59 »
Hallo zusammen,

kurze Antwort: Vielen Dank, es funktioniert. Gelöst.

lange Antwort: Der Code brachte mir den numerisch niedrigsten Kunden (Carl) mit seiner Nummer. Andersrum war es gebraucht, wie Beacker schon gesagt hat. Ich also die Feldbezeichnung im MIN() geändert uuuund... - Essig. Es dauerte eine Weile, bis ich merkte, dass es im ON auch vorkommt ...

Übrigens: nachdem es klappte, wurde ich mutig.  8) Ich hatte mich über die zwei ONs gewundert. Dass der zweite wichtig ist, war mir nach der Aktion klar, ein Versuch mit diesen Testdaten hat aber ergeben, dass der erste nicht gebraucht wird.

Und ich habe auch sonst viel aus der Lösung gelernt. Das schreibe ich hier mal hin, vielleicht hilft es einem anderen Newbie. (Oder mir, wenn ich das irgendwann mal wieder vergessen habe...)
Hintergrund: Ich hatte mir mal was über Unteranfragen selbst beigebracht, aber da war es so, dass die Gruppierung etc. in der äußeren Tabelle war, die innere Tabelle Werte "geliefert" hat und in der äußeren Tabelle hat man sie dann mit Referenzierung auf die innere Tabelle ausgelesen.

Die Konstruktion hier ist genial anders, ich verstehe sie so: Die innere Tabelle macht die Aggregation und liefert eine temporäre Tabelle mit einem Eintrag pro Aktennummer und der benötigten kleinen Kundennummer. Über die Gleichheit im ON wird dann in der äußeren Tabelle der dazugehörige Name dazugebeamt.

Vielen Dank!

Hans-Jürgen